Не удается добавить компонент в существующий макроэлемент или удалить

Автор lavgirb, 12.04.24, 13:13:42

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

lavgirb

Не удается добавить компонент в существующий макроэлемент или удалить компонент из существующего макроэлемента.
При создании нового макроэлемента в него вставить компоненты удается. Используя свойство Objects.
Но поменять состав макроэлемента не получается.
Делаю так
1 Получаю массив компонентов макроэлемента vObj = Objects
2 Увеличиваю массив на один элемент и теперь Objects = vObj
Если в макроэлементе был один компонент, то он почему-то исключается из макроэлемента, и остается только один, который хотел добавить.
А цель - получить макроэлемент с двумя компонентами.
В SDK как-то маловато информации на эту тему.
Что можно предпринять?
Спасибо.


A.n.d.r.e.w

Пришлите фрагмент кода, что ли. В какой среде кодите, на каком языке?

lavgirb

VB6
Надеюсь, понятно.
Код не работающий, как задумано.
       
         vMacroObjects = oMacroObj3D.Objects
         
         '
         If InStr(1, sName, EXCLUDED_FROM_SPEC, vbTextCompare) > 0 Then
            '
            ' Поместить компонент oPart7 в макроэлемент
            '
            If IsEmpty(vMacroObjects) Then
               Set vMacroObjects = oPart7
            ElseIf IsArray(vMacroObjects) Then
               ub = UBound(vMacroObjects)
               ub = ub + 1
               ReDim Preserve vMacroObjects(ub)
               Set vMacroObjects(ub) = oPart7
            Else
               vMacroObjects = Array(vMacroObjects, oPart7)
            End If
         Else
            '
            ' Исключить компонент oPart7 из макроэлемента
            '
            If IsEmpty(vMacroObjects) Then GoTo END_FUNCTION
            '
            If IsArray(vMacroObjects) Then
               For Each vMacroObject In vMacroObjects
                  If vMacroObject Is oPart7 Then
                     vMacroObject = Empty
                     Exit For
                  End If
               Next
            Else
               If vMacroObjects Is oPart7 Then
                  vMacroObjects = Empty
               End If
            End If
         End If
         
         With oMacroObj3D
            .Objects = vMacroObjects
            .Update
            ' vMacroObjects = .Objects
         End With

A.n.d.r.e.w

не силен в вижуалбейсике, в ms office немного макросы кнопал.
вообще работа с обычными массивами и безопасными несколько отличается.
хотя наверное не в VB, там все переменные варианты.
такое ощущение что с индексацией что-то не то ведь иногда массивы начинаются с 1 а иногда с 0
попробуйте добавить не один а например три элемента и посмотрите какие исчезнут какие добавятся.

lavgirb


feron

Цитата: lavgirb от 13.04.24, 18:58:33Понял.

Обществознание придерживается разделению знаний ибо это постулат уно нанбер.. так поделитесь просвещением! И просвещение поделится с Вами!  :police:  (Ф.Ницше)

feron

Цитата: A.n.d.r.e.w от 13.04.24, 18:03:07вижуалбейсике

а Вы знали что апокалипсис начался с вижуал басик ? на что люди не идут что бы не изучать с++. (страдания, похоть, унижение и полное неведение наше все!!!!)
Шурики и шарики!!

UU

Нужно получить объекты макроэлемента 3D, далее его разрушить, а потом добавить или удалить ненужные путём создания нового макроэлемента 3D.
+ Благодарностей: 1

lavgirb

Цитата: UU от 17.04.24, 07:24:12Нужно получить объекты макроэлемента 3D, далее его разрушить, а потом добавить или удалить ненужные путём создания нового макроэлемента 3D.
UU, спасибо большое. Вы подтвердили то, до чего я дошел практически. Так и сделал.
Теперь надо решить задачу переноса нового макроэлемента снизу на прежнее место.
С помощью PlaceFeatureAfter пока не получается переместить.

UU

После PlaceFeatureAfter нужно перестроить документ.
Макроэлемент 3D можно редактировать, но нужно использовать интерфейс ksMacro3DDefinition, чтобы добавить элемент использовать метод Add, а для удаления получить интерфейс удаляемого элемента в дереве IFeature7 и удалить, элемент удаляется из дерева и из макроэлемента.

lavgirb


lavgirb

Цитата: UU от 17.04.24, 10:21:19После PlaceFeatureAfter нужно перестроить документ.
Вот код. PlaceFeatureAfter возвращает False и перемещения макроэлемента в дереве не происходит.
Есть ли тут что-то, на что еще можно обратить внимание?

'
===============================================================================
Private Function PlaceMacroAfter(ByRef oMacro As KompasAPI7.MacroObject3D, _
                                ByRef oMacroAfter As KompasAPI7.MacroObject3D, _
                                ByRef oSelMgr As KompasAPI7.SelectionManager) As Boolean
  Dim oDoc3D_5      As Kompas6API5.Document3D
  Dim oSelMng_5    As Kompas6API5.SelectionMng
  Dim oFeat_5      As Kompas6API5.entity
  Dim oFeatAfter_5  As Kompas6API5.entity
  '
  Set oDoc3D_5 = moKO5.ActiveDocument3D
  Set oSelMng_5 = oDoc3D_5.GetSelectionMng
  '
  oSelMgr.UnselectAll
  oSelMgr.Select oMacro
  Set oFeat_5 = oSelMng_5.First
 
  oSelMgr.UnselectAll
  oSelMgr.Select oMacroAfter
  Set oFeatAfter_5 = oSelMng_5.First
 
  ' oSelMgr.UnselectAll
 
  PlaceMacroAfter = oDoc3D_5.PlaceFeatureAfter(oFeat_5, oFeatAfter_5)
  oDoc3D_5.RebuildDocument
End Function

UU

Нормально всё перемещается в дереве, даже без перестроения первый рисунок и с перестроением второй.
Вы хорошо справку читали, что Вы передаёте в функцию PlaceFeatureAfter?


lavgirb

Цитата: UU от 20.04.24, 09:33:45Нормально всё перемещается в дереве, даже без перестроения первый рисунок и с перестроением второй.
Вы хорошо справку читали, что Вы передаёте в функцию PlaceFeatureAfter?
Попробовал по другому. Результата пока не получил.
Заменял o3d_MacroObject на o3d_unknown. Результат такой же: не удается получить коллекцию.

featColl.JPG

UU

Причём тут o3d_unknown?
Вы с деревом работаете.
+ Благодарностей: 1

lavgirb

UU, заработал стабильно такой код.
Огромное спасибо за подсказки.
Наверное, можно его пооптимизировать, но пока сойдет.
Потом посмотрим, если будет подтормаживать на больших сборках.

Private Function PlaceMacroAfter(ByRef oMacro As KompasAPI7.MacroObject3D, _
                                 ByRef oMacroAfter As KompasAPI7.MacroObject3D, _
                                 ByRef oSelMgr As KompasAPI7.SelectionManager) As Boolean
   Dim oDoc3D_5      As Kompas6API5.Document3D
   Dim oSelMng_5     As Kompas6API5.SelectionMng
   Dim oEnt_5        As Kompas6API5.entity
   Dim oFeat_5       As Kompas6API5.Feature
   Dim oFeatAfter_5  As Kompas6API5.Feature
   '
   oSelMgr.UnselectAll
   oSelMgr.Select oMacro
   oSelMgr.Select oMacroAfter
   '
   Set oDoc3D_5 = moKO5.ActiveDocument3D
   Set oSelMng_5 = oDoc3D_5.GetSelectionMng
   
   Set oEnt_5 = oSelMng_5.First
   Set oFeat_5 = oEnt_5.GetFeature
   '
   Set oEnt_5 = oSelMng_5.Last
   Set oFeatAfter_5 = oEnt_5.GetFeature
   '
   PlaceMacroAfter = oDoc3D_5.PlaceFeatureAfter(oFeat_5, oFeatAfter_5)
   '
   SetNothing oDoc3D_5, oSelMng_5, oEnt_5, oFeat_5, oFeatAfter_5
End Function

UU

+ Благодарностей: 1

feron

Читал журнал - были люди которые программировали сразу на байт коде  :o:

feron

Цитата: UU от 20.04.24, 12:13:56Куда ему деваться.

А знаете ли Вы как не просто реализовать графический объект без каких либо фреймворков на с++ ? и как управлять памятью gpu - да это жесть полная!
А про чистый Си вообще молчу .. (скажу сразу что руководствуюсь Matlab Simulink Code Generator)

feron

Хочу добавить что забугорные универы не скупы на различные наработки и охотно делятся ими.. мы живем лишь раз ..