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

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

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

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

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

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

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

Навигация по 3D объектам

Автор anton.gorschnev, 17.09.24, 16:23:08

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

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

anton.gorschnev

 Добрый день, помогите с навигацией по 3D объектам. Задача простая в любой момент времени получать необходимый элемент модели поверхность, ребро, вершину (для назначения взаимосвязей в сборках или нанесения размера в чертежах). Как я понял назначить атрибут на выше указанные объекты не получится, Reference использовать тоже нельзя (изменяется при сохранении файла детали и т.д.), UniqueMetaObjectKey не понял судя по всему для поверхностей, ребер, вершин отсутствует.   

anton.gorschnev

Не ужели в Компасе нет возможности пометить элемент геометрии чтобы по метке возвращать требуемый элемент??? 

lavgirb

Цитата: anton.gorschnev от 18.09.24, 10:18:08Не ужели в Компасе нет возможности пометить элемент геометрии чтобы по метке возвращать требуемый элемент??? 
А кто говорил, что будет легко?)
Вариант. На вскидку.
Перед сохранением модели записывать в текстовый файл геометрические параметры объектов, местоположение и Reference.
После загрузки модели по параметрам перебором определять объекты и их новые Reference и с ними работать.
Не подойдет?

anton.gorschnev

Нашел как присвоить индификатор, теперь надо найти способ быстро получать этот объект (без использования цикла в явном виде).
IModelContainer modelContainer = (IModelContainer)part7;
IRotated Rotated = modelContainer.Rotateds.Rotated[0];
IFeature7 IFeature7_ = (IFeature7)Rotated;
object[] Faces_ = IFeature7_.ModelObjects[Obj3dType.o3d_face];
IFace IFace_ =(IFace) Faces_[0];
IModelObject IModelObject_ = (IModelObject)IFace_;
IModelObject_.Name = "Name";

anton.gorschnev

Вернул требуемый элемент, но через цикл. Может все таки есть способ обойтись без цикла?
                    ISelectionManager ISelectionManager_ = document3D.SelectionManager;
                    ISelectionManager_.UnselectAll();
                   
                    IFeature7 IFeature7_ = (IFeature7)part7;
                    object[] Faces_ = IFeature7_.ModelObjects[Obj3dType_];
                    foreach (IModelObject IModelObject_ in Faces_)
                    {
                        if(IModelObject_.Name== NameObject)
                        {
                            ISelectionManager_.Select(IModelObject_);
                            break;
                        }
                    }

Vi2

В нашем приложении ADEM4KOMPAS используется IUserDataStoragesMng, в котором хранятся грани и рёбра, необходимые в обработке.
+ Благодарностей: 1

anton.gorschnev

Итого, на мой взгляд самый оптимальный вариант.
запись в базу
IUserDataStoragesMng IUserDataStoragesMng_= document3D.UserDataStoragesMng;
IUserDataStorages IUserDataStorages_ = IUserDataStoragesMng_.Add(null);
IUserDataStorage IUserDataStorageGeometry_ = IUserDataStorages_.Add("ModelObject");
IUserDataStorageGeometry_.Version[""] = 1;
IUserDataStorageGeometry_.AddObject("", Object_, "Coment");
IUserDataStorageGeometry_.SetPassword("", "Password");
возврат
public static bool ReturnModelObject(IUserDataStoragesMng IUserDataStoragesMng_, string DataName_, string Comment,  out object object_, out int numb)
        {
            bool Check = false;
            object_ = null;
            numb = -1;
            if (IUserDataStoragesMng_.Count > 0)
            {
                IUserDataStorages IUserDataStorages_ = IUserDataStoragesMng_[null];
                if (IUserDataStorages_ != null && IUserDataStorages_.Count > 0)
                {
                    IUserDataStorage IUserDataStorage_ = IUserDataStorages_[DataName_];
                    if (IUserDataStorage_ != null)
                    {
                        string note = IUserDataStorage_.GetObject(Comment, out object_, out numb);
                        if (object_ != null)
                        {
                            Check = true;
                        }
                    }   
                }
            }
            return Check;
        }