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

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

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

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

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

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

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

Начало координат программно

Автор Cherepushka, 04.07.17, 15:13:39

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

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

Cherepushka

Всем доброго времени суток!
Есть много объектов. У некоторых объектов центр (точка опоры, Pivot, точка относительно которой вращается объект, как еще можно назвать?) в начале координат, а у некоторых нет.
Создал макрос. Щелкаю по грани, выбрал Эскиз, вставил из буфера обмена текст. Операция - Вырезать - выдавливанием. Все хорошо для объектов, у которых начало координат не в центре.
Можно ли программно во всех файлах начало координат переместить в центр объекта?
Спасибо.

ТрындецЪ

Мало что понятно из объяснения. Что за объекты? Прямоугольники, окружности или что-то посложнее? С местонахождением центра прямоугольника и окружности понятно, с другими сложнее. Давайте конкретнее и с примерами.

Cherepushka

Спасибо за ответ.
Во вложении два файла. Можно ли начало координат переместить на объект, на котором текст? Чтобы в дальнейшем во втором файле сработал макрос и появился текст в том же месте.

Cherepushka

Если не трогать систему координат, то возможно ли следующее:
Выделять любую грань - запустить макрос и чтобы текст появился на той грани, по которой сделал щелчок.
Сейчас получается только это:
Выделяю грань и запускаю макрос. Всё сработало и текст появился.
Теперь выделяю совсем другую грань и запускаю макрос. Текст появляется на первой грани.

ТрындецЪ

Приложите ещё свой макрос, чтобы видеть Ваш код.

Cherepushka


ТрындецЪ

Бегло посмотрел код. Вы как записали макрос, так в нём ничего не меняли, видимо.
Там не увидел работы с выделенными объектами (была речь о выделенной грани).
Будет время, подробнее изучу эту тему.

Cherepushka

Как я записывал макрос.
Сначала выделил грань. Затем начал записывать макрос - переход в Эскиз и т.п.
Было бы замечательно, если щелчком по любой грани срабатывал макрос, именно на ту грань, по которой щелкнул.

ТрындецЪ

06.07.17, 09:53:22 #8 Последнее редактирование: 06.07.17, 11:07:14 от ТрындецЪ
Как я понял, в этом коде выделение работает в холостую.
В качестве базовой плоскости эскиза выбирается первая по списку плоскость из коллекции плоскостей.
# Получение детали или главного компонента сборки
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)

# Создание нового интерфейса эскиза
iSketch = iPart.NewEntity(LDefin3D.o3d_sketch)

# Получение интерфейса параметров эскиза
iDefinition = iSketch.GetDefinition()

# Получение массива поверхностей детали
iCollection = iPart.EntityCollection(LDefin3D.o3d_face)

# Исключить из массива все поверхности, не содержащие точку с заданными координатами
iCollection.SelectByPoint(-0.05, 14.2, -8.8)

# Получение интерфейса первой плоскости в коллекции
iPlane = iCollection.GetByIndex(0)

# Задание базовой плоскость эскиза
iDefinition.SetPlane(iPlane)

# Создание эскиза
iSketch.Create()

Chipollino

В макросы далеко не всё записывается так, как происходит в интерфейсе.
Конкретно в случае с гранями и эскизами, то там всё в абсолютных координатах, без привязки к выделению.
Даже если начать запись с места где идёт выделение грани, то в коде про это ничего не будет - только указание координат.

Как вариант, можно получить коллекцию всех граней, а затем пробежаться по ней и найти выделенную - от неё и плясать.

Но это уже писать руками - библиотека такое не сделает



# Выделить грань содержащую точку с заданными координатами
iCollection.SelectByPoint(-0.05, 14.2, -8.8)

Это не выделение, это исключение из коллекции всех граней не содержащих точку. В коллекции останется одна - её и используют дальше
+ Благодарностей: 1

ТрындецЪ

Скорректировал код.
Грань должна быть выделена до запуска макроса, причём только одна.
# Получение детали или главного компонента сборки
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)

# Создание нового интерфейса эскиза
iSketch = iPart.NewEntity(LDefin3D.o3d_sketch)

# Получение интерфейса параметров эскиза
iDefinition = iSketch.GetDefinition()

# Получение интерфейса выделения
iSelectionManager = iKompasDocument3D.SelectionManager

# Получение интерфейса выделенного объекта
iPlane = iSelectionManager.SelectedObjects

# Преобразование интерфейса
iPlane = iKompasObject.TransferInterface(iPlane, 1, 0)

# Задание базовой плоскость эскиза
iDefinition.SetPlane(iPlane)

# Создание эскиза
iSketch.Create()
+ Благодарностей: 1

Cherepushka

Спасибо большое.
Но при выборе любой грани - текст создается на одной и той же грани. Т.к. макрос создавался именно на ней. Возможно ли убрать эту связь?

ТрындецЪ

Цитата: Cherepushka от 06.07.17, 11:32:45
Но при выборе любой грани - текст создается на одной и той же грани. Т.к. макрос создавался именно на ней. Возможно ли убрать эту связь?
Грань выбирается до запуска. Вам другую ещё грань нужно выбирать потом?

Cherepushka

Да
Ну к примеру: Я выбрал одну грань, запустил макрос, текст появился. Затем выбрал другую грань и там тоже появляется.
Этот же макрос будет работать в других файлах?

ТрындецЪ

Выбрать грань, запустить макрос. Выбрать другую грань, запустить второй макрос.
Либо в код включать запрос от пользователя указания грани после выполнения первой операции, но это уже сложнее.
Вообще с этим кодом много возни ещё (пересчёт координат и т.п.), а у Вас, как я вижу, навыков программирования мало. Сложно придется.

Cherepushka

Спасибо большое.
Но если в каждом файле по 3 грани и 150 файлов. То сколько макросов нужно ваять.
Что делать, будем копать дальше. Начнем с iSurface.
Вот нашел на форуме близкое, сейчас будем стараться. Правильно ли я понимаю, что
Face1 = iDocument3D.GetSelectionMng()
if Face1.GetCount() == 0:
        iKompasObject.ksError('Не веделено')
        return
    if Face1.GetCount() > 1:
        iKompasObject.ksError('Больше одного')
        return
MyFace = Face1.GetObjectByIndex(0)
iPart = MyFace.GetParent()

и делаю с iPart что хочу?

ТрындецЪ

Цитата: Cherepushka от 06.07.17, 12:24:19
Спасибо большое.
Но если в каждом файле по 3 грани и 150 файлов. То сколько макросов нужно ваять.
Что делать, будем копать дальше. Начнем с iSurface.
Вот нашел на форуме близкое, сейчас будем стараться. Правильно ли я понимаю, что
Face1 = iDocument3D.GetSelectionMng()
if Face1.GetCount() == 0:
        iKompasObject.ksError('Не веделено')
        return
    if Face1.GetCount() > 1:
        iKompasObject.ksError('Больше одного')
        return
MyFace = Face1.GetObjectByIndex(0)
iPart = MyFace.GetParent()

и делаю с iPart что хочу?
Этот код так же работает с одной гранью, только ещё проверку делает предварительно.
Если нужно несколько граней, то можно по очереди выделить их сначала, при этом они попадут в массив выделенных объектов в этом же порядке. Затем запустив макрос можно обращаться к элементам этого массива. Вот только нужно проверить, сохраняется ли массив после выполнения первой операции или обнуляется. Если обнуляется, можно попробовать reference номер граней запомнить(если он есть у них вообще) и потом по этому номеру к ним обращаться.

Cherepushka

Спасибо за ответ.
На данный момент пойдет и на одну грань. А когда продвинусь дальше, то постараюсь сделать.
Сейчас пробую вставить свои данные из буфера обмена в этот код. http://forum.ascon.ru/index.php/topic,27309.0.html
Но куда мне свою эту часть вставить?
# вставка из буфера обмена (для пример вставляю палочку)
   obj = iDocument2D.ksLineSeg(36.06633329567, -0.27966740494, 36.06633329567, -0.02827875479, 1)
   iDefinition.EndEdit()

Просто очень надо, а вручную делать более 150 файлов, можно двинуться

Cherepushka

ТрындецЪ, большое спасибо.
С одной гранью получилось. Теперь буду изучать и пробовать с массивами.

ТрындецЪ

Вот простой пример, как выбрать плоскость из массива выделенных плоскостей
SelectionManager = iKompasDocument3D.SelectionManager
# массив выделенных объектов
Planes = SelectionManager.SelectedObjects

# Интерфейс плоскости по индексу расположения в массиве
# (в данном случае индекс "0", значит обращаемся к первой выделенной плоскости)
iPlane = iKompasObject.TransferInterface(Planes[0], 1, 0)