Удаление элементов

Автор Mitya, 22.11.03, 12:37:37

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

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

От него много зависит, фактически Компас-3D посылается сообщение Windows, через PostMessage или SendMessage.
PS. Вроде в SDK об этом, чётко написано.

bbb

Про Windows в SDK ничего не написано, написано так
post
- true - запуск команды через PostMessage,

- false - через SendMessage.

что это значит?  Какой параметр мне нужен?

Почитайте о событиях Windows, это к Компасу отношение не имеет.
http://forum.ascon.ru/index.php/topic,28123.msg212151.html#msg212151

bbb

Спасибо, сделал через итератор, удаляю по одному. Так проще чем с этими командами разбираться, которые не работают...

Но теперь, когда я изменяю эскиз, тело почему то остается прежним, т.е. операция работает по старому эскизу...
UPD: Надо было деталь на редактирование взять, так нормально заработало.

Команды работают, а разбираться с ними или нет, дело Ваше.

graphdark

Как в дереве построения модели найти элемент и удалить его либо отредактировать? Я программно задаю имя элементу. Конкретно плоскости под углом, потом на ней эскиз и вырез. Я так считаю, что если я удалю плоскость, удалятся все зависимые элементы.

От контейнера получить IAuxiliaryGeomContainer.Planes3D - интерфейс коллекции плоскостей, найти нужную плоскость IPlane3D, получить от неё интерфейс IFeature7 и удалить IFeature7.Delete.

Михаил88

29.09.21, 16:12:57 #27 Последнее редактирование: 29.09.21, 18:19:50 от Михаил88
Я так удалял

# -*- coding: utf-8 -*-
from win32com.client import Dispatch, gencache

kompas_api7_module = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
application = Dispatch('Kompas.Application.7')

kompas_document = application.ActiveDocument
iKompasDocument1 = kompas_api7_module.IKompasDocument1(kompas_document)
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iPart7 = kompas_document_3d.TopPart

iFeature7 = kompas_api7_module.IFeature7(iPart7)
subfeatures = iFeature7.SubFeatures(0, False, False)
for obj in subfeatures:
    try:
        Name = obj.Name
        if Name == 'Эскиз:3':
            iKompasDocument1.Delete(obj)

    except Exception:
        print(obj, 'Ошибка')

graphdark

function TStatistic.DelOp(n: integer): Boolean;
var
  feat: iFeature7;
  AuxiliaryGeomContainer, SurfCon: IAuxiliaryGeomContainer;
  iPlanes: iPlanes3D;
  iPlane: iPlane3D;
begin
  SurfCon := Form1.iPart as IAuxiliaryGeomContainer;
  iPlanes := surfCon.Planes3D;
  iPlane := iPlanes.Plane3D[n+3];
  feat := iPlane as iFeature7;
  feat.Delete;
end;
По имени так и не придумал, как обратиться. Обращаюсь по индексу, считаю, что 3 плоскости уже есть, а n-моя. Падает на DELETE. ЧЯДНТ?

Михаил88

А что по имени то не получилось, я ведь выше полный код выложил. Вместо 'Эскиз:3' пишите название вашей плоскости.

graphdark

Цитата: Михаил88 от 01.10.21, 09:43:42А что по имени то не получилось, я ведь выше полный код выложил. Вместо 'Эскиз:3' пишите название вашей плоскости.
У вас надо получить переменную SubFeatues, так и не сообразил какого типа. Потом по массиву SubFeatures надо еще переменную для каждого объекта, чтобы в цикле имя искать. Я ваш код сначала на паскаль переводил.

Михаил88

SubFeatures - Коллекция элементов дерева заданного типа в виде массива SAFEARRAY DISPATCH - VT_ARRAY | VT_DISPATCH

Это массив. В SDK вроде все понятно написано.
Name - Имя объекта
это строка
получается в цикле сравниваем имя текущего элемента с именем того что нужно удалить. Если совпадает удаляем.

Цитата: graphdark от 01.10.21, 09:40:02По имени так и не придумал, как обратиться. Обращаюсь по индексу, считаю, что 3 плоскости уже есть, а n-моя. Падает на DELETE. ЧЯДНТ?
Правильно делает, что падает, где проверки?
DeletePlane.png

graphdark

01.10.21, 12:15:00 #33 Последнее редактирование: 01.10.21, 13:01:47 от graphdark
Цитата: Sabahs от 01.10.21, 10:27:03Правильно делает, что падает, где проверки?
Вы уже мне говорили про проверки ранее, учел, делаю их до вызова функции. Спасибо, все получилось, полный код.
function TStatistic.DelOp(n: integer): Boolean;
var
  feat: iFeature7;
  SurfCon: IAuxiliaryGeomContainer;
  iPlanes: iPlanes3D;
  iPlane: iPlane3D;
  PlaneName: string;
  i: integer;
begin
  PlaneName := 'PlaneAngle'+IntToStr(n);
  i := -1;
  SurfCon := Form1.iPart as IAuxiliaryGeomContainer;
  iPlanes := surfCon.Planes3D;
  i := iPlanes.Count - 1;
  while i <> -1 do
  begin
    iPlane := iPlanes.Plane3D[i];
    if iPlane.Name = PlaneName then
    begin
      feat := iPlane.Owner;
      feat.Delete;
      i := 0;
    end;
    Dec(i);
  end;
end;
PS: у вас настройки студии такие? Или в Lazaruse пишете?