09 января, 2014

Отражение.

Довольно часто в процессе разработки конструкторской документации возникает необходимость в зеркалировании (отражении) несимметричных объектов: отводов, гнутых профилей и т.п.
Средствами СПДС это осуществляется довольно просто: через контекстное меню

или через меню СПДС команда «Перевернуть объект».
К сожалению, при таком способе зеркалирования, положение объекта зачастую сохраняется лишь до очередного вызова диалога редактирования или изменения положения связанного с ним объекта, после этого приходится применять команду повторно, естественно это вызывает определенные неудобства. Да и выполнить операцию за один клик мышкой, быстрее чем за несколько.
Поэтому рассмотрим еще несколько способов симметричного отражения объекта.
Для того, что бы появились ручки зеркалирования:
Способ №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;
 //………………..
}
Смотрим , что получилось в результате.

Возможно есть и другие способы зеркального отображения параметрических объектов, в данной статье я привел известные мне.

13 комментариев :

  1. Андрей, спасибо за статью!
    Я даже не знал, что можно добавить ручку для вращения. Беру себе на вооружение :)

    ОтветитьУдалить
    Ответы
    1. Ручки достаточно мощный инструмент. С их помощью можно, вращать, растягивать, отражать. Думаю, что теоретически с их помощью можно изменять вид и представление параметрического объекта (правда не проверял)

      Удалить
    2. нашел время, проверил, можно не только вид менять, но и представление, не только через точки привязки но и через свойства объекта.

      Удалить
  2. Андрей, а вы не подскажете, если при этом в объекте есть текст, есть ли возможность как то решить проблему с зеркальным текстом?

    ОтветитьУдалить
    Ответы
    1. К сожалению насколько мне известно, такой возможности нет, при зеркаллировании объекта изменяется направлении, vecPlane, что аналогично противоположному отображению этого объекта (лево-право, верх-низ, фронт-тыл) и даже при создании в противоположном виде текста, неважно какого, зеркального, или обычного, на чертеже противоположного (зеркальный вид) вида, текст будет отзеркалирован(((
      Возможности обойти это ограничение напрямую, на мой взгляд нет, иначе CSoft сделала, бы вид с размерами не так криво.
      Если текст все же необходим, возможно есть смысл воспользоваться универсальным маркером, или выноской?
      Если вы хотите использовать текст в параметрическом объекте для образмеривания..., на эту тему готовлю статью, все возможно, хотя не так красиво, как хотелось бы.

      Удалить
    2. Спасибо. Я так и понял, и уже в принципе смирился.
      Если честно, я терпеть не могу маркеры и стараюсь максимально исключить их из своей работы. Так что зеркальные объекты приходится зеркально и перечерчивать )

      Удалить
    3. если не трудно, мне требуется для общего развития, приведите пример, с параметрическим объектом, сложной формы, (коль требуется зеркаллирование), и что за текст там прописан??? я так понимаю, текст не статический, а берется значение какого-то параметра в текст.
      90% ответа на вопрос, его точная формулировка. )))

      Удалить
    4. Текстом у меня всегда выступает маркировка объекта.
      Вот фрагмента плана перекрытия, состоящего из объектов, http://clip2net.com/s/6MmPri

      Удалить
    5. текст позиции прекрасно разворачивается сам при вращении объектов, зачем зеркаллировать осесиметричные объекты?????
      для плит со скосами... не надо их зеркалировать, сделай два исполнения левый скос и допустим правый скос, внутри одного объекта, там пропиши виды для каждого исполнения и все проблем не будет.

      Удалить
    6. Да у меня сделан и левый скос и правый скос, и куча там всяких разных скосов сделано ) тем и живу...
      Просто планы большие...плит много, пока все эти скосы сделаешь, расставишь перфорацию, расставишь закладные, сформируешь геометрию плиты. Это все время. Время - деньги. Можно было бы экономить до 50% времени. А так - да, все решаемо, и в общем-то решено.

      Удалить
    7. ну тут каждый решает сам, использовать группу маркер+плита (кстати в базе прекрасно сохраняется)
      или отрисовывать зеркальные виды, хотя не вижу тут проблемы, да и затраты временные не сильно возрастают,
      отрисовал один вид, сохранил исполнение, отзеркалировал примитивы, сохранил еще одно исполнение в тот же объект, поставил грипс, который будет не зеркалировать, а переключать исполнения (левый скос, правый скос) плюс к этим же исполнениям виды (сверху, снизу и т.д.), все будет работать корректно.

      Удалить
    8. Зачем сохранять исполнение ) Ты не понял...все что ты видел на картинке, это все один параметрический объект. Он просто мегатрансформер. Я придаю ему форму, раскладываю на плане, получаю спецификацию плит на плане. Беру эти же плиты получаю с них автоматически КЖИ, сразу же заполняется спецификация КЖИ.
      Но время эта раскладка занимает действительно не мало.

      Удалить