• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

рекурсивный обход сборки 3D

Автор Fomenko75, 18.05.17, 15:01:52

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

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

Fomenko75

Добрый день.

Делаю рекурсивный обход сборки 3D

                                Document3D Doc3D = (Document3D) kompas.ActiveDocument3D();
                                ksPartCollection Parts = Doc3D.PartCollection(true);
                                int pCount = Parts.GetCount();
                                for (int i = 0; i < Parts.GetCount(); i++)
                                {
                                    ksPart Part = Parts.GetByIndex(i);
                                    LoadPartsObjects(Part, DseNode);
                                }

public void LoadPartsObjects(ksPart p_KsPart)
        {

            if (p_KsPart.IsDetail())
            {
   
               
              // Деталь 
               
            }
            else
            {

                string n = p_KsPart.name;

                ksDocument3D ks3dDoc   = (ksDocument3D)p_KsPart;        //    Вот  здесь исключение . не может привести к типу ksDocument3D
                ksPartCollection Parts = ks3dDoc.PartCollection(true);
                int pCount = Parts.GetCount();
                for (int i = 0; i < Parts.GetCount(); i++)
                {
                    ksPart Part = Parts.GetByIndex(i);
                    LoadPartsObjects(Part, p_DseNode);
                }
            }
        }



   
Что можете посоветовать .. Как ksPart привести к типу ksDocument3D   или получить ссылку на узловой элемент имея  ksPart

Akew

Никогда не задумывался, как привести ksPart к ksDocument3D...

А для рекурсивного обхода сборки я использую IPart7, и его свойство PartsEx (с параметрами) - все в точности, как описано в IPart7.
Попробуйте, мне это представляется более перспективным, чем Ваш способ.

Fomenko75

Продолжаю тему.  Строю дерево из сборки 3D с указанием позиций и кол-ва элементов

IKompasDocument3D IDoc3D = (IKompasDocument3D)IKompApp.ActiveDocument;
                                IPart7 IPart = IDoc3D.TopPart;

                                TreeNode DseNode = new TreeNode();
                                DseNode.ImageIndex = 0;
                                DseNode.SelectedImageIndex = 0;
                                FileInfo fi = new FileInfo(IPart.FileName);
                                DseNode.Text = fi.Name;
                                DseNode.Tag = IPart;
                                SpecificationBaseObjects spcobj = IDoc3D.SpecificationDescriptions.Active.BaseObjects;
                                DseNode.Tag = spcobj;
                                treeView1.Nodes.Add(DseNode);
                                object[] arrComp = IPart.PartsEx[0];
                                for (int i = 0; i < arrComp.GetLength(0); i++)
                                {
                                    IPart7 Part = (IPart7)arrComp;
                                    LoadPartsObjects(Part, DseNode);
                                }

public void LoadPartsObjects(IPart7 p_IPart7, TreeNode p_DseNode)
        {

            if (p_IPart7.Detail)
            {
                TreeNode DetNode = new TreeNode();
                DetNode.ImageIndex = 2;
                DetNode.SelectedImageIndex = 2;
                FileInfo fi = new FileInfo(p_IPart7.FileName);
                DetNode.Text = fi.Name;

                // Получаю позицию детали из объекта спец-ии
                #region базовые объекты спецификация из p_DseNode.tag

                SpecificationBaseObjects SpcObjs = (SpecificationBaseObjects)p_DseNode.Tag;
                //По всем объектам ищу деталь по   Reference         
                if (SpcObjs != null)
                {
                    reference r =  p_IPart7.Reference;
                    foreach (SpecificationBaseObject bObj in SpcObjs)
                    {
                        string sign = bObj.Columns[3].ColumnItems[0].Value.ToString();

                        if (bObj.Reference == r)   //   Но тут  reference p_IPart7   и reference  объекта спецификации не совпадают
                        {
                            //  Беру  позицию  из объекта спецификации     
                        }
                    }

                }
                #endregion

                p_DseNode.Nodes.Add(DetNode);

            }
            else
            {

                string n = p_IPart7.Name;
                ksDocument3D ks3dDoc = kompas.Document3D();
                ks3dDoc.Open(p_IPart7.FileName, false);
                TreeNode AssmNode = new TreeNode();
                IKompasDocument idoc = (IKompasDocument)IKompApp.ActiveDocument;
                AssmNode.Tag = idoc.SpecificationDescriptions.Active.BaseObjects;

                FileInfo fi = new FileInfo(p_IPart7.FileName);
                AssmNode.Text = fi.Name;
                AssmNode.ImageIndex = 1;
                AssmNode.SelectedImageIndex = 1;
                p_DseNode.Nodes.Add(AssmNode);

                object[] PartsObj = p_IPart7.PartsEx[0];
                for (int i = 0; i < PartsObj.GetLength(0); i++)
                {
                    IPart7 Part = (IPart7)PartsObj;
                    LoadPartsObjects(Part, AssmNode);
                }
            }
        }

не получается найти объект в спецификации по IPart7.Reference.  Как вообще можно сослаться на объект  в спецификации   имея Ipart7  ?