Редактирование содержимого группы выделенных макроэлементов

Автор Sprinter500, 12.04.19, 12:51:19

« предыдущая - следующая »

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

Sprinter500

Всем доброго дня! Есть потребность автоматизировать процесс редактирования содержимого одинаковых макроэлементов. Например:
1. Изменить цвет заливок, которые лежат внутри выделенных макроэлементов.
2. Удалить какой либо объект внутри выделенной группы макроэлементов.
3. Либо (как альтернатива п1-п2) - заменить выделенные макроэлементы, на отредактированный вручную. При этом должна оставаться не изменной точка привязки и ориентация по углу заменяемого макроэлемента из выделенной группы макроэлементов.

Есть идеи как это сделать? Принимаются во внимание примеры на Delphi или C#.

Какой от этого будет полезный эффект: сокращение во много раз времени на редактирование групп одинаковых макроэлементов.

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


DesignЯR

ЦитироватьЕсть потребность автоматизировать процесс редактирования содержимого одинаковых макроэлементов.

Начнем с вопросов.
1. Макроэлементы 2D или 3D?
2. "Одинаковых" - по имени, содержимому или как еще?
3. Макроэлементы - библиотечные - или просто созданные в  документе и размноженные копированием?
4. Если 2D - то они будут расположены в одном виде - или могут быть разбросаны по разным?
5. Делаем для компаса инструмент  "FindAndReplace" ?
6. Как будет выполняться выбор заменяемых элементов - автоматом по имени или указанием в дереве(документе)?

Sprinter500

Цитата: DesignЯR от 13.04.19, 15:14:25
Начнем с вопросов.
1. Макроэлементы 2D или 3D?
2. "Одинаковых" - по имени, содержимому или как еще?
3. Макроэлементы - библиотечные - или просто созданные в  документе и размноженные копированием?
4. Если 2D - то они будут расположены в одном виде - или могут быть разбросаны по разным?
5. Делаем для компаса инструмент  "FindAndReplace" ?
6. Как будет выполняться выбор заменяемых элементов - автоматом по имени или указанием в дереве(документе)?


1. Речь о 2D.
2. Копированные макроэлементы. То есть полностью идентичные.
3. Созданные вручную.
4. В одном виде. Хотя в редких случаях могут быть и в разных видах. В общем редкие случаи можно не рассматривать пока что.
5. Тут я не понял - что за инструмент такой?
6. Выбор выделением вручную выделением рамкой или тыком мышкой с зажатым CTRL. Далее предполагается работа с выделенной группой макроэлементов.

tramp_m

Цитата: Sprinter500 от 12.04.19, 12:51:19
Всем доброго дня! Есть потребность автоматизировать процесс редактирования содержимого одинаковых макроэлементов. Например:
1. Изменить цвет заливок, которые лежат внутри выделенных макроэлементов.
2. Удалить какой либо объект внутри выделенной группы макроэлементов.
3. Либо (как альтернатива п1-п2) - заменить выделенные макроэлементы, на отредактированный вручную. При этом должна оставаться не изменной точка привязки и ориентация по углу заменяемого макроэлемента из выделенной группы макроэлементов.

Есть идеи как это сделать? Принимаются во внимание примеры на Delphi или C#.

Какой от этого будет полезный эффект: сокращение во много раз времени на редактирование групп одинаковых макроэлементов.

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


Это же групповые чертежи деталей или сборочных единиц , а не  макроэлементы
И запрограммировать все действия, которые могут прийти в умную голову невозможно, труд не благодарный, и языков программирования довольно большоооооой.....
А, вообще вам на голове постоять или на ушах попрыгать не надо....... :)


Мечтать не вредно, но чревато.

С уважением tramp_m

Sprinter500

Цитата: tramp_m от 14.04.19, 22:26:12
Это же групповые чертежи деталей или сборочных единиц , а не  макроэлементы
И запрограммировать все действия, которые могут прийти в умную голову невозможно, труд не благодарный, и языков программирования довольно большоооооой.....
А, вообще вам на голове постоять или на ушах попрыгать не надо....... :)


Нет, тут речь не о групповых чертежах деталей и не сборочных единицах. Требуется небольшая утилитка по работе с группой выделенных копий макроэлемента, созданного пользователем. Например: контур в виде трапеции, в ней заливка, все это объединено в макроэлемент и размножено на чертеже, например копированием по окружности. И тут нужно изменить цвет заливки внутри макроэлементов, не разрушая макроэлементы.

DesignЯR

ЦитироватьЕсть идеи как это сделать? Принимаются во внимание примеры на Delphi или C#.

Идею как это сделать предложу, с кодом пока нет времени заниматься - рабочая загрузка.
ЦитироватьТут я не понял - что за инструмент такой?

"FindAndReplace" - во многих редакторах при нажатии ctrl+shift+F вылазит форма, на которой вводится в одном поле текст который нам нужно изменить, а в другом текст на который его  нужно изменить. Такое есть и в Embarcadero и в VisualStudio. Посмотрите как работает - можно полностью скопировать его принцип работы.
Алгоритм такой:
Создаете пользовательскую панель(Step12). В ней наверно можно будет хранить данные.(Возможен вариант с формой-но это не точно) На ней создаете кнопку, при нажатии на которую получаете ссылку на выделенный в данный момент макроэлемент (базовый - на который надо будет заменить остальные). Сохраняете в панели ссылку на макроэлемент, выделение с макроэлемента снимаете.
   Затем выделяете объекты для замены.По нажатии на кнопку на панели из массива  ISelectionManager.SelectedObjects (если заменять выделение) или IMacroObjects (если надо выбрать все макроэлементы с подобным именем в текущем виде(на крайняк пройтись по всем видам и их IMacroObjects) ) получить IMacroObject. В новый список (массив) записать полученные через IMacroObject.GetPlacement X,Y,Angle. Удалить через IKompasDocument1.Delete(VARIANT Objects ) выделенные элементы. Затем по полученным координатам с помощью IKompasDocument2D1.CopyObjects (VARIANT Objects)  согласно полученного массива координат и углов  макроэлементов  разместить базовый макроэлемент.
  Можно просто по кнопкам на панели нажимать и перемещаться по массиву IMacroObjects и подсвечивать макроэлемент на чертеже - если подсвечен тот что нужно - менять(Delete +CopyObjects) на базовый.
В общих чертах как-то так, хотя я уже и сам запутался как лучше сделать.

Sprinter500

Цитата: DesignЯR от 15.04.19, 08:52:42
Идею как это сделать предложу, с кодом пока нет времени заниматься - рабочая загрузка."FindAndReplace" - во многих редакторах при нажатии ctrl+shift+F вылазит форма, на которой вводится в одном поле текст который нам нужно изменить, а в другом текст на который его  нужно изменить. Такое есть и в Embarcadero и в VisualStudio. Посмотрите как работает - можно полностью скопировать его принцип работы.
Алгоритм такой:
Создаете пользовательскую панель(Step12). В ней наверно можно будет хранить данные.(Возможен вариант с формой-но это не точно) На ней создаете кнопку, при нажатии на которую получаете ссылку на выделенный в данный момент макроэлемент (базовый - на который надо будет заменить остальные). Сохраняете в панели ссылку на макроэлемент, выделение с макроэлемента снимаете.
   Затем выделяете объекты для замены.По нажатии на кнопку на панели из массива  ISelectionManager.SelectedObjects (если заменять выделение) или IMacroObjects (если надо выбрать все макроэлементы с подобным именем в текущем виде(на крайняк пройтись по всем видам и их IMacroObjects) ) получить IMacroObject. В новый список (массив) записать полученные через IMacroObject.GetPlacement X,Y,Angle. Удалить через IKompasDocument1.Delete(VARIANT Objects ) выделенные элементы. Затем по полученным координатам с помощью IKompasDocument2D1.CopyObjects (VARIANT Objects)  согласно полученного массива координат и углов  макроэлементов  разместить базовый макроэлемент.
  Можно просто по кнопкам на панели нажимать и перемещаться по массиву IMacroObjects и подсвечивать макроэлемент на чертеже - если подсвечен тот что нужно - менять(Delete +CopyObjects) на базовый.
В общих чертах как-то так, хотя я уже и сам запутался как лучше сделать.



Спасибо, попробую сделать по предложенному алгоритму. Что получится - выложу

tramp_m

Это так далеко от ГОСТ которое, вроде как, декларировалось в КОМПАС... :shu:
Или вас это не смущает, важнее прихоть варианта... 88))
Конечно мнение староватого не достойно внимание, как говориться дело хозяйское.... :)
Мечтать не вредно, но чревато.

С уважением tramp_m

Sprinter500

Цитата: tramp_m от 15.04.19, 13:18:59
Это так далеко от ГОСТ которое, вроде как, декларировалось в КОМПАС... :shu:
Или вас это не смущает, важнее прихоть варианта... 88))
Конечно мнение староватого не достойно внимание, как говориться дело хозяйское.... :)


Где, в каком ГОСТе говорится о макроэлементах в CAD-системах? Важнее удобство работы и экономия времени, чтобы успеть больше сделать. Вручную десятки, а то и сотни макроэлементов (не библиотечных, а обычных) перелопачивать как-то не комильфо.

tramp_m

Цитата: Sprinter500 от 15.04.19, 13:33:21
Где, в каком ГОСТе говорится о макроэлементах в CAD-системах? Важнее удобство работы и экономия времени, чтобы успеть больше сделать. Вручную десятки, а то и сотни макроэлементов (не библиотечных, а обычных) перелопачивать как-то не комильфо.


И, для какой «работы и экономия времени, чтобы успеть больше сделать», вам вдруг понадобилось это нечто.....
Ну, точно, «в каком ГОСТе», подскажите можно прочитать про макроэлемент, или динамическую библиотеку, или нечто похожее....
А, вопрос, «Удобства работы» это вопрос сугубо индивидуальный...
Кому что и как нравиться решает каждый в отдельности для себя....
Кому коделак, а кому кабриолет....
Уж не взыщите за простоту...
Мечтать не вредно, но чревато.

С уважением tramp_m

Sprinter500

Цитата: tramp_m от 15.04.19, 22:57:38
И, для какой «работы и экономия времени, чтобы успеть больше сделать», вам вдруг понадобилось это нечто.....
Ну, точно, «в каком ГОСТе», подскажите можно прочитать про макроэлемент, или динамическую библиотеку, или нечто похожее....
А, вопрос, «Удобства работы» это вопрос сугубо индивидуальный...
Кому что и как нравиться решает каждый в отдельности для себя....
Кому коделак, а кому кабриолет....
Уж не взыщите за простоту...



Ну и к чему эти дебаты? Лучше пускай будет инструмент, чем его не будет. А пользоваться или нет, никто никого не принуждает. Каждый сам решает. Если знаете альтернативу чтобы не делать плагин, подскажите способ, с удовольствием выслушаю, а дальше философствовать не вижу смысла.

Sprinter500

Цитата: DesignЯR от 15.04.19, 08:52:42
Идею как это сделать предложу, с кодом пока нет времени заниматься - рабочая загрузка."FindAndReplace" - во многих редакторах при нажатии ctrl+shift+F вылазит форма, на которой вводится в одном поле текст который нам нужно изменить, а в другом текст на который его  нужно изменить. Такое есть и в Embarcadero и в VisualStudio. Посмотрите как работает - можно полностью скопировать его принцип работы.
Алгоритм такой:
Создаете пользовательскую панель(Step12). В ней наверно можно будет хранить данные.(Возможен вариант с формой-но это не точно) На ней создаете кнопку, при нажатии на которую получаете ссылку на выделенный в данный момент макроэлемент (базовый - на который надо будет заменить остальные). Сохраняете в панели ссылку на макроэлемент, выделение с макроэлемента снимаете.
   Затем выделяете объекты для замены.По нажатии на кнопку на панели из массива  ISelectionManager.SelectedObjects (если заменять выделение) или IMacroObjects (если надо выбрать все макроэлементы с подобным именем в текущем виде(на крайняк пройтись по всем видам и их IMacroObjects) ) получить IMacroObject. В новый список (массив) записать полученные через IMacroObject.GetPlacement X,Y,Angle. Удалить через IKompasDocument1.Delete(VARIANT Objects ) выделенные элементы. Затем по полученным координатам с помощью IKompasDocument2D1.CopyObjects (VARIANT Objects)  согласно полученного массива координат и углов  макроэлементов  разместить базовый макроэлемент.
  Можно просто по кнопкам на панели нажимать и перемещаться по массиву IMacroObjects и подсвечивать макроэлемент на чертеже - если подсвечен тот что нужно - менять(Delete +CopyObjects) на базовый.
В общих чертах как-то так, хотя я уже и сам запутался как лучше сделать.



Почти доделал по такому варианту. Но понял, что такой способ подойдет не всегда. Дело в том что если макроэлемент был создан и размножен копированием, то координаты точек привязки и углы различны и способ годится. А если элементы были созданы последовательно по-отдельности (идентичные или чуть различные) то у них у всех координаты и углы 0, 0, 0. Даже если имеется некоторый поворот. Например если такие макроэлементы созданы внешней программой через API. То есть помимо массовой замены макроэлементов нужен и 2 способ: последовательное открывание макроэлементов для редактирование и работа с его содержимым - например изменение цвета заливки внутри макроэлемента или замена заливки на штриховку (и наоборот) или придание имени макроэлемента по цвету заливки. Кстати если в макроэлементе не заливка, а штриховка то стиль можно поменять и вручную для группы выделенных макроэлементов, а вот если это заливка то команда на изменение цвета недоступна к сожалению и отчасти для этого и надо создать данный плагин.

DesignЯR

Вот поэтому и задавались вопросы и были получены ответы
Цитировать2. Копированные макроэлементы. То есть полностью идентичные.
3. Созданные вручную.

Было бы полное описание решаемой задачи, может были бы и другие советы.
Можно в макроэлементе из внешней программы создавать первой прямую стилем "вспомогательная" и по ней определять координаты и угол.
Я к тому, что чтобы получить желаемые результаты нужно четче формулировать задачи, а то кое-кто вообще понял задачу по-своему и нафлудил не по теме...

Sprinter500

Цитата: DesignЯR от 17.04.19, 14:06:29
Вот поэтому и задавались вопросы и были получены ответы Было бы полное описание решаемой задачи, может были бы и другие советы.
Можно в макроэлементе из внешней программы создавать первой прямую стилем "вспомогательная" и по ней определять координаты и угол.
Я к тому, что чтобы получить желаемые результаты нужно четче формулировать задачи, а то кое-кто вообще понял задачу по-своему и нафлудил не по теме...



Хорошо, сужу круг поисков до минимума. Вот я скажем получил доступ к объекту через IMacroObject. Как теперь просмотреть его содержимое (объекты внутри макроэлемента)? Например - узнать цвет заливки внутри макроэлемента.

ТрындецЪ

Цитата: Sprinter500 от 17.04.19, 14:20:42
Вот я скажем получил доступ к объекту через IMacroObject. Как теперь просмотреть его содержимое (объекты внутри макроэлемента)? Например - узнать цвет заливки внутри макроэлемента.

Макроэлемент == Вид. Свойства и методы у них одинаковы.

Sabahs

Получаете IDrawingContainer от IMacroObject и находите, что там есть, а там может быть всё, что угодно, т.к. макроэлементы могут быть вложенными, иметь зеркальность, т.ч. скучно не будет.
Если у Вас, есть вопросы, то их можно задать тут:
- "Оборудование: Развёртки";
- "Библиотека пакетного сохранения файлов".

Sprinter500

Цитата: Sabahs от 17.04.19, 14:36:08
Получаете IDrawingContainer от IMacroObject и находите, что там есть, а там может быть всё, что угодно, т.к. макроэлементы могут быть вложенными, иметь зеркальность, т.ч. скучно не будет.


Получилось сделать то что хотел. Спасибо. Как только код в нормальный вид приведу, выложу сюда.

Sprinter500

Выкладываю то, что обещал - исходник приложения в Delphi.
Пока что реализована только замена цвета заливок в выделенных макроэлементах на выбранный.
Также есть пока нерабочий код замены группы выделенных макроэлементов на макроэлемент с именем "base" (ошибка в в копировании макроэлемента - нужно правильно интерфейс параметров копирования задать).

И еще такой моменты, что то я случайно зацепил, что теперь компилируются только в DEBUG-версию. Знатоки - посомтрите пожалуйста что не так, и может быть у Вас дополнительно появятся идеи по дальнейшему расширению функционала приложения - всем миром создадим мощный инструмент КОМПАСа по работе с макроэлементами.

Sprinter500

Экзешник. Часть 1. Работает только последняя кнопка