Довольно часто в процессе разработки конструкторской документации возникает необходимость в зеркалировании (отражении) несимметричных объектов: отводов, гнутых профилей и т.п.
Средствами СПДС это осуществляется довольно просто: через контекстное меню
или через меню СПДС команда «Перевернуть объект».
К сожалению, при таком способе зеркалирования, положение объекта зачастую сохраняется лишь до очередного вызова диалога редактирования или изменения положения связанного с ним объекта, после этого приходится применять команду повторно, естественно это вызывает определенные неудобства. Да и выполнить операцию за один клик мышкой, быстрее чем за несколько.
Поэтому рассмотрим еще несколько способов симметричного отражения объекта.
Для того, что бы появились ручки зеркалирования:
Способ №1.
В мастере объектов, в описании этого объекта в свойстве "Класс" вводим индекс класса:
объект перестанет перекрывать другие объекты независимо от rZOrder;
не будет возможности задавать зависимости с другими объектами... возможно, пропадут другие функции.
Получим такие ручки:
Способ №2.
По моему мнению, более удобен: описать необходимое поведение параметрического объекта в методах SetGripPoint, OnMoveGripPoint и OnChangeParameters, в этом случае объект будет отражаться корректно.
В методе SetGripPoint описываем количество и положение ручек:
Все то же самое, что и в методе OnMoveGripPoint, за исключением, что теперь новое положение объекта получаем не от ручки, а от связанной зависимостью плоскости, в данном случае WP1.
Возможно есть и другие способы зеркального отображения параметрических объектов, в данной статье я привел известные мне.
Средствами СПДС это осуществляется довольно просто: через контекстное меню
или через меню СПДС команда «Перевернуть объект».
К сожалению, при таком способе зеркалирования, положение объекта зачастую сохраняется лишь до очередного вызова диалога редактирования или изменения положения связанного с ним объекта, после этого приходится применять команду повторно, естественно это вызывает определенные неудобства. Да и выполнить операцию за один клик мышкой, быстрее чем за несколько.
Поэтому рассмотрим еще несколько способов симметричного отражения объекта.
Для того, что бы появились ручки зеркалирования:
Способ №1.
В мастере объектов, в описании этого объекта в свойстве "Класс" вводим индекс класса:
- 680 - двери (SPDSDOOR),
- 670 - окна (SPDSWINDOW)
объект перестанет перекрывать другие объекты независимо от rZOrder;
не будет возможности задавать зависимости с другими объектами... возможно, пропадут другие функции.
Получим такие ручки:
Способ №2.
По моему мнению, более удобен: описать необходимое поведение параметрического объекта в методах SetGripPoint, OnMoveGripPoint и OnChangeParameters, в этом случае объект будет отражаться корректно.
В методе SetGripPoint описываем количество и положение ручек:
function SetGripPoint { NGrip=3; // количество ручек pntGrip0=pntOrigin; //за которуюю двигаем pntGrip1=pntOrigin-vecDirection*DNf/2; // за которую вращаем pntGrip2=pntOrigin+vecPlane*DNf/2; //за эту ручку зеркалируем. }В методе OnMoveGripPoint опишем реакцию объекта на перемещение ручек:
function OnMoveGripPoint { if (NMovingGrip==1){ //вращаем объект vecXOld=vecDirection; //запоминаем положение vecDirection vecDirection=-(pntGrip1-pntGrip0); //новое положение vecDirection restoreBasis(vecXOld,vecPlane,vecDirection); //восстанавливаем систему координат объекта } else if (NMovingGrip==2){ //зеркалируем объект относительно vecDirection (по «Х») if (lViewType == VFRONT){ //если фронт, то зеркалируем по vecDirection vecPlane=-vecPlane ; } else { vecPlane=(pntGrip2-pntGrip0); //если вид не фронт, то вращаем за эту ручку объект (например виды слева или справа), на видах сверху и снизу ручки №0 и №2 –одна точка. } } else { pntOrigin=pntGrip0; //перемещаем объект } }В методе OnChangeParameters (только в том случае, если осуществляется связь с другими объектами - геометрическая зависимость)
Все то же самое, что и в методе OnMoveGripPoint, за исключением, что теперь новое положение объекта получаем не от ручки, а от связанной зависимостью плоскости, в данном случае WP1.
function OnChangeParameters { //……………….. Handled=OBJ_HANDLED; fix=0; if(IsFixedParam(WP1,TRUE)){ fix=1; vecX11Old=vecDirection; vecDirection=-Vector(new.WP1); pntOrigin=Point(new.WP1); restoreBasis(vecX11Old,vecPlane,vecDirection); } if(fix>1) Handled=OBJ_ERROR; //……………….. }Смотрим , что получилось в результате.
Андрей, спасибо за статью!
ОтветитьУдалитьЯ даже не знал, что можно добавить ручку для вращения. Беру себе на вооружение :)
Ручки достаточно мощный инструмент. С их помощью можно, вращать, растягивать, отражать. Думаю, что теоретически с их помощью можно изменять вид и представление параметрического объекта (правда не проверял)
УдалитьМожно, я проверял... )
Удалитьнашел время, проверил, можно не только вид менять, но и представление, не только через точки привязки но и через свойства объекта.
УдалитьАндрей, а вы не подскажете, если при этом в объекте есть текст, есть ли возможность как то решить проблему с зеркальным текстом?
ОтветитьУдалитьК сожалению насколько мне известно, такой возможности нет, при зеркаллировании объекта изменяется направлении, vecPlane, что аналогично противоположному отображению этого объекта (лево-право, верх-низ, фронт-тыл) и даже при создании в противоположном виде текста, неважно какого, зеркального, или обычного, на чертеже противоположного (зеркальный вид) вида, текст будет отзеркалирован(((
УдалитьВозможности обойти это ограничение напрямую, на мой взгляд нет, иначе CSoft сделала, бы вид с размерами не так криво.
Если текст все же необходим, возможно есть смысл воспользоваться универсальным маркером, или выноской?
Если вы хотите использовать текст в параметрическом объекте для образмеривания..., на эту тему готовлю статью, все возможно, хотя не так красиво, как хотелось бы.
Спасибо. Я так и понял, и уже в принципе смирился.
УдалитьЕсли честно, я терпеть не могу маркеры и стараюсь максимально исключить их из своей работы. Так что зеркальные объекты приходится зеркально и перечерчивать )
если не трудно, мне требуется для общего развития, приведите пример, с параметрическим объектом, сложной формы, (коль требуется зеркаллирование), и что за текст там прописан??? я так понимаю, текст не статический, а берется значение какого-то параметра в текст.
Удалить90% ответа на вопрос, его точная формулировка. )))
Текстом у меня всегда выступает маркировка объекта.
УдалитьВот фрагмента плана перекрытия, состоящего из объектов, http://clip2net.com/s/6MmPri
текст позиции прекрасно разворачивается сам при вращении объектов, зачем зеркаллировать осесиметричные объекты?????
Удалитьдля плит со скосами... не надо их зеркалировать, сделай два исполнения левый скос и допустим правый скос, внутри одного объекта, там пропиши виды для каждого исполнения и все проблем не будет.
Да у меня сделан и левый скос и правый скос, и куча там всяких разных скосов сделано ) тем и живу...
УдалитьПросто планы большие...плит много, пока все эти скосы сделаешь, расставишь перфорацию, расставишь закладные, сформируешь геометрию плиты. Это все время. Время - деньги. Можно было бы экономить до 50% времени. А так - да, все решаемо, и в общем-то решено.
ну тут каждый решает сам, использовать группу маркер+плита (кстати в базе прекрасно сохраняется)
Удалитьили отрисовывать зеркальные виды, хотя не вижу тут проблемы, да и затраты временные не сильно возрастают,
отрисовал один вид, сохранил исполнение, отзеркалировал примитивы, сохранил еще одно исполнение в тот же объект, поставил грипс, который будет не зеркалировать, а переключать исполнения (левый скос, правый скос) плюс к этим же исполнениям виды (сверху, снизу и т.д.), все будет работать корректно.
Зачем сохранять исполнение ) Ты не понял...все что ты видел на картинке, это все один параметрический объект. Он просто мегатрансформер. Я придаю ему форму, раскладываю на плане, получаю спецификацию плит на плане. Беру эти же плиты получаю с них автоматически КЖИ, сразу же заполняется спецификация КЖИ.
УдалитьНо время эта раскладка занимает действительно не мало.