Список форумов Конференция САПР Bentley MicroStation Конференция САПР Bentley MicroStation
www.ustation.ru
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Отрисовка дуг

 
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное
Предыдущая тема :: Следующая тема  
Автор Сообщение
Rus77



Зарегистрирован: 06.03.2006
Сообщения: 53

СообщениеДобавлено: Ср Мар 15, 2006 2:14 pm    Заголовок сообщения: Отрисовка дуг Ответить с цитатой

Здравствуйте!!
Столкнулся с проблемой отрисовки дуг. Не могу разобраться с вопросом - что такое начальный угол (element.AsArcElement.StartAngle)?
Попробовал "скопировать", т.е. перерисовать заданную дугу, изменив только Z=0 координат центра и начальной и конечной точек. В результате получаю дугу, непонятно как отзеркаленную, то есть начало и конец дуги не совпадают с нарисованным....
Почему он так "зеркально" рисует дуги? Как определять начальный угол?
----------------------------------
Public arElem() as Element
Public idxAr as Long

idxAr=0
ReDim arElem(idxAr)

'функция отрисовки дуги по заданной
Private Sub TestArcElem(welem As element)
Dim tStPt As Point3d, tEndPt As Point3d, tCntPt As Point3d
Dim tStAngle As Double, tSweepAngle As Double
Dim tRadMain As Double, tRadSec As Double
Dim tCurMatr3D As Matrix3d

tStPt = welem.AsArcElement.StartPoint
tEndPt = welem.AsArcElement.EndPoint
tCntPt = welem.AsArcElement.CenterPoint
tStAngle = welem.AsArcElement.StartAngle
tSweepAngle = welem.AsArcElement.SweepAngle
tRadMain = welem.AsArcElement.PrimaryRadius
tRadSec = welem.AsArcElement.SecondaryRadius
tCurMatr3D = Application.Matrix3dIdentity()
tStPt.Z = 0
tEndPt.Z = 0
tCntPt.Z = 0
Set arElem(idxAr) = Application.CreateArcElement2(Nothing, tCntPt, tRadMain, tRadSec, tCurMatr3D, tStAngle, tSweepAngle)
arElem(idxAr).Color = 153
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
ReDim Preserve arElem(idxAr + 3)
Set arElem(idxAr) = Application.CreateLineElement2(Nothing, welem.AsArcElement.StartPoint, tStPt)
arElem(idxAr).Color = 44
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
Set arElem(idxAr) = Application.CreateLineElement2(Nothing, welem.AsArcElement.EndPoint, tEndPt)
arElem(idxAr).Color = 214
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
Set arElem(idxAr) = Application.CreateLineElement2(Nothing, welem.AsArcElement.CenterPoint, tCntPt)
arElem(idxAr).Color = 51
arElem(idxAr).LineWeight = 2
idxAr = idxAr + 1
End Sub
' формирование фрагмента из массива элементов и вывод в модель...
----------------------------------------------
С уважением
Руслан
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Ср Мар 15, 2006 4:45 pm    Заголовок сообщения: Ответить с цитатой

На первый взгляд, дело в следующем:
Там остается матрица без изменений, а точки меняются, вот она и рисует невесть что...
Если менять только точки, то и рисовать надо бы только по точкам
Код:

Set ArcElement = object.CreateArcElement1 (Template, StartPoint, CenterPoint, EndPoint)

Не знаю как она рисует в VBA арки, а в MDL если рисовать по трем точкам, то отрисовка идет строго против часовой стрелки.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



Зарегистрирован: 06.03.2006
Сообщения: 53

СообщениеДобавлено: Ср Мар 15, 2006 5:32 pm    Заголовок сообщения: Ответить с цитатой

Пробовал и по трем точкам. Похоже и в VBA рисует против часовой стрелки. Но что делать, если нужно по часовой отрисовать?
Кстати, какую матрицу Вы имели в виду? Возможно ли ее обновить? У меня есть уравнение плоскости, в которой должна лежать дуга, и нормаль к ней.
Есть еще функция рисования
Set ArcElement = object.CreateArcElement4 (Template, StartTangent, EndPoint)
где задается начальная точка, направление касательной и конечная точка. Как определить направление касательной?
---------------------------
Заранее спасибо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Ср Мар 15, 2006 5:52 pm    Заголовок сообщения: Ответить с цитатой

Цитата:

Но что делать, если нужно по часовой отрисовать?

По моему, ответ напрашивается сам собой Smile
Просто поменять точки. Я поступаю именно так.

Цитата:

Кстати, какую матрицу Вы имели в виду? Возможно ли ее обновить?

Matrix3d - трехмерная матрица, которая определяет положение в пространстве.
Конечно можно. Даже нужно, если требуется разместить арку без указания точек.

Цитата:

У меня есть уравнение плоскости, в которой должна лежать дуга, и нормаль к ней.

Этого достаточно для определения матрицы
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



Зарегистрирован: 06.03.2006
Сообщения: 53

СообщениеДобавлено: Вт Окт 09, 2007 8:23 am    Заголовок сообщения: Ответить с цитатой

И снова здрасте, и снова вопросы по дугам
Главная задача - заменить часть эллипса. Пробовал дугой:
Код:

    Dim behElem As element, stPoint As Point3d
    Dim cntrPt As Point3d, begAng As Double, swpAng As Double, prRad As Double, secRad As Double, curMtrxRot As Matrix3d
    Dim arElems() As element

    cntrPt = behElem.AsEllipticalElement.centerPoint
    ' [DEBUG] cntrPt={1000;750;0}
    prRad = behElem.AsEllipticalElement.PrimaryRadius
    secRad = behElem.AsEllipticalElement.SecondaryRadius
    ' [DEBUG] prRad=1000; secRad=750
    curMtrxRot = behElem.AsEllipticalElement.Rotation
    ' [DEBUG] curMtrxRot={{1;0;0},{0;1;0},{0;0;1}}
    stPoint = behElem.AsEllipseElement.PointAtDistance(0)
    ' [DEBUG] stPoint={2000;750;0}
   ' функция get2DAngelLine (pt1,pt2) определяет угол наклона прямой, заданной точками pt1 и pt2, к оси OX в 2D
   ' функция get2DPtFrom3D преобразует Point3D в Point2D путем отсечения координаты Z
    begAng = curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), curClPts.get2DPtFrom3D(stPoint))
    swpAng =curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), arStruct(i).valPt)
    ' [DEBUG] arStruct(i).valPt={1500;923,205080756888}
    ' [DEBUG] begAng=0, swpAng=0,333473172251832 (~19,1066 грС)
   ReDim arElems(0)
   Set arElems(0) = CreateArcElement2(Nothing, cntrPt, prRad, secRad, curMtrxRot, begAng, swpAng - begAng)

В итоге получаю дугу, описывающую нужную часть эллипса, но...
в информации по этой дуге пишется "Угол разворота: 19.106605 грС", а на самом деле, проведя прямые из центра дуги по ее краям получаем угол 3.9632 грС, да и сама дуга намного меньше ожидаемой.
В чем проблема? И если виновата матрица, то как и почему ее нужно преобразовывать?
По поводу функции CreateArcElement2 - это единственная из 5 функций, которой в принципе можно заменить эллипс, остальные работают с окружностями, то есть prRad=secRad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rus77



Зарегистрирован: 06.03.2006
Сообщения: 53

СообщениеДобавлено: Вт Окт 09, 2007 8:40 am    Заголовок сообщения: Ответить с цитатой

Попробовал использовать MDL функцию:
Код:

Public Function getArcFromEllips(inElem As element, inStAng As Double, inSwAng As Double) As element
Dim descrP As Long, elemPOut As Long, elementP As Long
Dim curElps As Ellipse3d, curFrstPt As Point3d
Set getArcFromEllips = Nothing
    ' формирование структуры описания эллипса
    ' начальный угол
    curElps.start = inStAng ' [DEBUG] curElps.start=0
    ' угол разворота
    curElps.Sweep = inSwAng ' [DEBUG] curElps.Sweep=0,33347 (~19,1066 грС)
    ' центр эллипса
    curElps.Center = inElem.AsEllipticalElement.centerPoint
    ' [DEBUG] curElps.Center={1000;750;0}
    ' определение начальной (0) точки
    curFrstPt = inElem.AsEllipseElement.PointAtDistance(0)
    ' [DEBUG] curFrstPt={2000;750;0}
    ' формирование вектора из центра в точку по 0 градусов
    curElps.Vector0.X = curFrstPt.X - curElps.Center.X
    curElps.Vector0.Y = curFrstPt.Y - curElps.Center.Y
    curElps.Vector0.Z = curFrstPt.Z - curElps.Center.Z
    ' [DEBUG] curElps.Vector0={1000;0;0}
    ' определение точки при 1/4 длины
    curFrstPt = inElem.AsEllipseElement.PointAtDistance(inElem.AsEllipseElement.Perimeter / 4)
    ' [DEBUG] curFrstPt={1000;950;0}
    ' формирование вектора из центра в точку по 90 градусов
    curElps.Vector90.X = curFrstPt.X - curElps.Center.X
    curElps.Vector90.Y = curFrstPt.Y - curElps.Center.Y
    curElps.Vector90.Z = curFrstPt.Z - curElps.Center.Z
    ' [DEBUG] curElps.Vector90={0;200;0}
    ' считывание описания элемента
    descrP = inElem.MdlElementDescrP
    ' получение ссылки на элемент по его описанию
    elementP = ElmdscrAccessor_getMSElement(descrP)
    ' попытка создания дуги по подобию эллипса
    mdlArc_createByDEllipse3d elemPOut, elementP, curElps
    ' !!!!!! Зависает MS (в частности PowerDraft) !!!!!!!
    Set getArcFromEllips = Application.MdlCreateElementFromElementDescrP(elemPOut)
End Function

При попытке создать дугу по приведенным данным зависает вся система. В чем здесь ошибка?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Вт Окт 09, 2007 10:15 am    Заголовок сообщения: Ответить с цитатой

С MDL есть смысл связываться, если возможности VBA исчерпаны ...

Код:

    begAng = curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), curClPts.get2DPtFrom3D(stPoint))
    swpAng =curClPts.get2DAngelLine(curClPts.get2DPtFrom3D(cntrPt), arStruct(i).valPt)


Здесь не совсем понятно что за объект curClPts, и правильно ли работют функции get2DAngelLine и get2DPtFrom3D. В остальном все вроде верно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



Зарегистрирован: 06.03.2006
Сообщения: 53

СообщениеДобавлено: Вт Окт 09, 2007 10:41 am    Заголовок сообщения: Ответить с цитатой

Ну вот потому, как не получилось в VBA, то решил проверить MDL.
Объект curClPts - это созданный свой класс, в котором собраны различные методы по работе с точками.
Функции get2DAngelLine и get2DPtFrom3D работают правильно, так как оттестированы на других проектах.
Тогда как объяснить различные данные, предоставляемые информацией и реальными размерами? Единственно, что приходит на ум - это какой-то глюк с матрицей, хотя зачем ее менять, если я объект не поворачиваю.....
Вот почему в свойствах полученной дуги показывает угол разворота 19,1 грС, а угол между прямыми, проведенными из центра дуги к ее краям, инструментом измерения угловых значений показывает 3,96 грС (что по внешнему виду более правдоподобно)??? И почему MDL не заработал? Хоть что-то бы нарисовал.....для разнообразия... Very Happy
Ну и если уже окончательно запутал - вопрос сначала. Каким образом мне, зная характеристики эллипса (радиусы, координаты центра и т.п.) построить дугу по двум известным точкам, которая по кривизне была бы аналогична исходному эллипсу?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Вт Окт 09, 2007 12:14 pm    Заголовок сообщения: Ответить с цитатой

Матрица, насколько я понимаю, не при чем.
Rus77 писал(а):
Ну и если уже окончательно запутал - вопрос сначала. Каким образом мне, зная характеристики эллипса (радиусы, координаты центра и т.п.) построить дугу по двум известным точкам, которая по кривизне была бы аналогична исходному эллипсу?

Точки находятся на эллипсе?
Единственная сложность, имхо, которая может возникнуть - это из-за того что точки могут быть указаны произвольно, придется определяться с направлением отрисовки дуги.
Кстати, а что такое грС?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



Зарегистрирован: 06.03.2006
Сообщения: 53

СообщениеДобавлено: Вт Окт 09, 2007 2:08 pm    Заголовок сообщения: Ответить с цитатой

грС - градус Цельсия... при программировании надо пользоваться радианами, а для наглядности нужны грС... Very Happy
Точки берутся как точки пересечения с другим элементом (в частности прямоугольником) и формируются стандартной функцией
arInterPoints = mainElem.AsIntersectableElement.GetIntersectionPoints(behElem, Matrix3dIdentity)
где arInterPoints - возвращаемый массив точек
mainElem - один из элементов
behElem - другой элемент
Matrix3dIdentity - матрица вращения
Порядок следования формируется путем сортировки расстояний по контуру от 0 точки до точек пересечения. При этом использую метод DistanceAtPoint(arInterPoints(i)). Теоретически должен получить точки эллипса в том порядке, в котором они были при отрисовки.
Единственно не пойму почему разница в свойствах полученной дуги и реальным образмериванием......Где копать-то.... Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Ср Окт 10, 2007 10:04 am    Заголовок сообщения: Ответить с цитатой

вообще кажись получается, что программирование здесь совсем не при чем...
если построить все вручную, то получается такая вот картина:
информация к размышлению
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Ср Окт 10, 2007 10:20 am    Заголовок сообщения: Ответить с цитатой

А вот кстати и решение Wink
_________________
Непонимание различия операторов OR и XOR может привести к зависанию в проеме. Спросите у Винни-Пуха.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



Зарегистрирован: 06.03.2006
Сообщения: 53

СообщениеДобавлено: Ср Окт 10, 2007 12:46 pm    Заголовок сообщения: Ответить с цитатой

Спасибо за документальное подтверждение моих догадок...Smile
Только не пойму для чего это делалось....Sad
Придется искать выход из сложившегося положения....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group