Считывание данных с kompas v16

Автор zeratul, 28.10.15, 12:58:13

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

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

#programmer

 iPart.EntityCollection(0) - вернёт не все операции, а все элементы (т.е. все плоскости, поверхности, рёбра, оси и т.д.)+ все операции. Так что нужно указывать параметр, того что вам необходимо.

Синтаксис Automation:
LPDISPATCH EntityCollection (short objType);
Входной параметр:
objType - тип объектов, содержащихся в массиве (Obj3dType для ksDocument3d - Типы объектов документа-модели)

Через IModelContainer, можно получить объекты так, используя фильтр (KompasAPIObjectTypeEnum):

KompasObject ikompas = (KompasObject)Marshal.GetActiveObject("Kompas.Application.5");
            ksDocument3D idoc3d = ikompas.ActiveDocument3D();
            IApplication app = ikompas.ksGetApplication7();
            IKompasDocument ikdoc = app.ActiveDocument;

            if (ikdoc != null)
            {
                if (ikdoc.DocumentType == Kompas6Constants.DocumentTypeEnum.ksDocumentAssembly ||
                    ikdoc.DocumentType == Kompas6Constants.DocumentTypeEnum.ksDocumentPart)
                {

                    IKompasDocument3D ikdoc3d = (IKompasDocument3D)app.ActiveDocument;

                    if (idoc3d != null && ikdoc3d != null)
                    {
                        ksPart prt = idoc3d.GetPart((int)Kompas6Constants3D.Part_Type.pTop_Part);
                        IPart7 p7 = ikdoc3d.TopPart;

                        if (prt != null && p7 != null)
                        {
                            IModelContainer mc = (IModelContainer)p7;
                            if (mc != null)
                            {                               
                                object[] objects = mc.Objects[KompasAPIObjectTypeEnum.ksObjectModelObject];
                                if (objects != null)
                                {
                                    foreach (object o in objects)
                                    {
                                        KompasAPI7.IKompasAPIObject ko = (KompasAPI7.IKompasAPIObject)o;                                       
                                        richTextBox1.AppendText(string.Format("Type = {0}\n", ko.Type));
                                    }                                   
                                }
                                else MessageBox.Show("objects is null!!!");
                            }
                            else MessageBox.Show("mc is null!!!");
                        }
                        else MessageBox.Show("part is null!");
                    }
                }
            }
Работает и для сборок, и для деталей.

zeratul

 iPart.EntityCollection(0)  для детали можно таким методом считать данные или нет?

С таким параметром, в коллекции будет всё, если нужны операции то можно попробовать передать o3d_operationElement - 110.

zeratul

у меня не получается данным методом считать что-нибудь у детали....
я произвожу программное чтение файла детали ".m3d"

            Если doc3D.IsDetail()<> 1 Тогда
               Для j = 0 По PColl.GetCount() - 1 Цикл
                  iPart = doc3D.GetPart(j);
                  If iPart.excluded Then
                     Continue;
                  EndIf;
                  КоличествоОпераций = iPart.EntityCollection(0).getcount();
                  КоличествоВсегоОпераций = КоличествоВсегоОпераций + КоличествоОпераций;
                  
                  Если КоличествоОпераций <= 15 Тогда
                     КоличествоДеталей_1_Категории = КоличествоДеталей_1_Категории + 1;   
                  КонецЕсли;
                  Если КоличествоОпераций>15 и КоличествоОпераций <= 40 Тогда
                     КоличествоДеталей_2_Категории = КоличествоДеталей_2_Категории + 1;   
                  КонецЕсли;
                  Если КоличествоОпераций > 40 Тогда
                     КоличествоДеталей_3_Категории = КоличествоДеталей_3_Категории + 1;   
                  КонецЕсли;
               КонецЦикла;
            Иначе
               iTopPart = kompas_v5.ksGetApplication7.ActiveDocument.TopPart;
               
  как мне из детали получить iPart.EntityCollection(0).getcount()???


            КонецЕсли;

zeratul

Сделал так

doc3D = kompas_v5.ActiveDocument3D;
КоличествоОпераций = doc3D.EntityCollection(110,false).getcount();

но все время возвращает значение 0...перепробовал несколько разных деталей

zeratul

Подскажите что я делаю не так

doc3D = kompas_v5.ActiveDocument3D;
КоличествоОпераций = doc3D.EntityCollection(110,false).getcount();

но все время возвращает значение 0...перепробовал несколько разных деталей

dosart

Как можно получить количесво элементов и сами элементы на чертеже? Если мы знаем тип объекта(например, окружности) то получив соответсвующую коллекцию объектов(например, коллекцию окружносте), то можно решить задачу.
А если тип объекта неизвестен заранее, как быть?

Получить тип объекта и привести его к соответствующему типу.
IDrawingContainer.Objects - массив SAFEARRAY объектов, входящих в состав данного объекта вида, можно указать какие объекты в массив писать, можно сразу все получить, а затем массив разобрать по запчастям.
IDrawingObject.DrawingObjectType - тип графического объекта.
+ Благодарностей: 1

dosart

Sabahs  , скажите пожалуйста, как можно менять масштаб у системного вида ? (т.е Views[0]). Менять масштаб у других видов не составляет проблем. 

У системного вида, если память не изменяет, всегда масштаб 1:1.
+ Благодарностей: 1

dosart

Sabahs  , если необходимо при вставке макрообъектов на чертёж, задавать  определённый масштаб(скажем, 1:40), то необходимо создать новый вид, установить  нужный масштаб? Другого пути нет?

Можно через матрицу масштабировать, но, как лучше, можно решить исходя из задачи, когда её можно 100% понять.

dosart

Где можно подробнее узнать про матрицу?
Задача такая. Есть чертёж. На данном чертеже нарисован макрообъект в масштабе 1 : 40.

  • Выделяем объект мышью
  • Нажимаем копировать
  • Открываем новый чертёж.
  • В новом чертеже нажимаем кнопку вставить
В итоге на новом чертеже появляется объект в формате 1 : 40. Я думал в момент вставки макрообъекта устанавливать масштаб 1 : 40. Однако, оказалось, что масштаб системного вида изменить нельзя.

В SDK можно почитать.
Mtr - создать матрицу преобразования координат.

dosart

Спасибо, почитаю.
Если создавать новый вид, и в  него добавлять макрообъект? Такое возможно? Как мне кажется,  через API нельзя создать новый вид?


dosart

С Вашей точки зрения такое решение корректно?
1. Создаём вид
2. Устанавливаем масштаб вида.
3. Добавляем макрообъекты на созданный вид


dosart

Я в том смысле, что вы сделали бы по другому.

dosart

27.04.17, 18:16:27 #39 Последнее редактирование: 27.04.17, 19:30:45 от dosart
Sabahs, Вы не знаете, как можно объединить несколько макрообъектов в один?