Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
stich
Зарегистрирован: 14.03.2008 Сообщения: 10
|
Добавлено: Пн Dec 01, 2008 9:52 am Заголовок сообщения: Вычитание |
|
|
Подскажите, кто знает, как можно реализовать вычитание одного тела из другого.
То есть надо, если два тела пересекаются (находят друг на друга), то из одного тела вырезать этот кусок пересечения. |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пн Dec 01, 2008 11:47 am Заголовок сообщения: |
|
|
В VBA это можно сделать только с использованием MDL функций
например так:
Код: |
Private Declare Function mdlKISolid_bodyToElementD _
Lib "stdkisolid.dll" (ByRef edPP As Long, _
ByVal bodyP As Long, _
ByVal wireframe As Long, _
ByVal nIsoParametrics As Long, _
ByVal templateP As Long, _
ByVal modelref As Long, _
ByVal threeD As Long) As Long
Private Declare Function mdlKISolid_subtract _
Lib "stdkisolid.dll" (ByVal B2 As Long, _
ByVal B1 As Long) As Long
Private Declare Function mdlKISolid_elementToBody _
Lib "stdkisolid.dll" (ByRef bodyPP As Long, _
ByVal edP As Long, _
ByVal modelref As Long) As Long
Private Declare Sub mdlKISolid_endCurrTrans _
Lib "stdkisolid.dll" ()
Private Declare Sub mdlKISolid_beginCurrTrans _
Lib "stdkisolid.dll" (ByVal modelRef As Long)
Private Declare Sub mdlKISolid_freeBody _
Lib "stdkisolid.dll" (ByVal bodyP As Long)
Dim bodyP1 As Long
Dim bodyP2 As Long
Dim elem1 As Element
Dim elem2 As Element
Dim elemResult As Element
Dim lngEldscrP As Long
Dim ret As Long
Dim oEnumerator As ElementEnumerator
Set oEnumerator = ActiveModelReference.GetSelectedElements
' должны быть выделены два элемента Solid
oEnumerator.MoveNext
Set elem1 = oEnumerator.Current
oEnumerator.MoveNext
Set elem2 = oEnumerator.Current
mdlKISolid_beginCurrTrans ActiveModelReference.MdlModelRefP
mdlKISolid_elementToBody bodyP1, elem1.MdlElementDescrP, ActiveModelReference.MdlModelRefP
mdlKISolid_elementToBody bodyP2, elem2.MdlElementDescrP, ActiveModelReference.MdlModelRefP
ret = mdlKISolid_subtract(bodyP1, bodyP2)
mdlKISolid_bodyToElementD lngEldscrP, bodyP1, False, -1, 0, ActiveModelReference.MdlModelRefP, True
mdlKISolid_endCurrTrans
Set elemResult = MdlCreateElementFromElementDescrP(lngEldscrP)
elem1.Redraw msdDrawingModeErase
elem2.Redraw msdDrawingModeErase
ActiveModelReference.RemoveElement elem1
ActiveModelReference.RemoveElement elem2
ActiveModelReference.AddElement elemResult
elemResult.Redraw msdDrawingModeNormal
mdlKISolid_freeBody (bodyP1)
|
|
|
Вернуться к началу |
|
|
stich
Зарегистрирован: 14.03.2008 Сообщения: 10
|
Добавлено: Пн Dec 01, 2008 12:35 pm Заголовок сообщения: |
|
|
Классно!
Большое спасибо! |
|
Вернуться к началу |
|
|
stich
Зарегистрирован: 14.03.2008 Сообщения: 10
|
Добавлено: Вт Dec 02, 2008 11:58 am Заголовок сообщения: |
|
|
А как можно сохранить все атрибуты редактируемого тела? У меня изначально это элемент металлоконструкции, а получается что вся инфа теряется. |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Вт Dec 02, 2008 1:12 pm Заголовок сообщения: |
|
|
stich писал(а): | А как можно сохранить все атрибуты редактируемого тела? У меня изначально это элемент металлоконструкции, а получается что вся инфа теряется. |
Теряется, потому что оба элемента удаляются:
Код: |
ActiveModelReference.RemoveElement elem1
ActiveModelReference.RemoveElement elem2
|
Нужно перед удалением скопировать атрибуты на новый элемент elemResult |
|
Вернуться к началу |
|
|
stich
Зарегистрирован: 14.03.2008 Сообщения: 10
|
Добавлено: Пт Dec 05, 2008 6:18 am Заголовок сообщения: |
|
|
Ни как не получаетcя новый элемент сделать металлоконструкцией. Подскажите как? |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пт Dec 05, 2008 10:34 am Заголовок сообщения: |
|
|
Что это значит - "Сделать металлоконструкцией"? |
|
Вернуться к началу |
|
|
Юра
Зарегистрирован: 30.01.2006 Сообщения: 59
|
Добавлено: Пт Dec 05, 2008 10:47 am Заголовок сообщения: |
|
|
видать имеется ввиду что бы не терялись атрибуты .... надеюсь они в тэгах ... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пт Dec 05, 2008 11:08 am Заголовок сообщения: |
|
|
Вероятно, "элемент металлоконструкции" генерируется каким-то приложением? |
|
Вернуться к началу |
|
|
stich
Зарегистрирован: 14.03.2008 Сообщения: 10
|
Добавлено: Пт Dec 05, 2008 11:21 am Заголовок сообщения: |
|
|
Когда в Structural рисуешь различные балки, они и есть металлоконструкции. Там в линейных манипуляциях есть такое, обновление/редактирование выреза, мне надо тоже самое и чтобы данные не потерялись. |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пт Dec 05, 2008 2:40 pm Заголовок сообщения: |
|
|
Я не программировал для Structural и не в курсе - какие там используются аттрибуты.
Да и переписывать Structural заново - неблагодарная задача...
Все что я здесь представил - код для чистого MS
Возможное решение задачи:
в Structural целесообразно использовать Structural VBA API |
|
Вернуться к началу |
|
|
|