Перейти к содержанию
  • записей
    9
  • комментариев
    18
  • просмотров
    890

О блоге

Всем доброго времени суток :)
Хочу поделится своим опытом работы в Cad программах и дать несколько советов по ускорению работы в них, а так же поделится некоторыми хитростями, которые, возможно, новые пользователи не знают. Идея это сделать живёт у меня давно, но руки дошли написать только сейчас. Думаю я не первый, кто этим делится, но возможно для вас буду именно тем самым первым :D

Записи в этом блоге

dromandon

Хочу написать гайд по отчётам таблиц, который будет понятен и нагляден.
Делаю это в первую очередь для коллег с которыми работаю, но, надеюсь, пригодиться и кому-то ещё.

 

0. Оговорка

Работаю в Нанокад СПДС 6.0

 

1. Задача

Поставим очень простую, но часто встречающуюся задачу - сложить длину объектов - в нашем случае надо будет узнать общую длину всех отрезков  в указанной области в определённом слое.

 

2. Начало работы.

Для удобства прикладываю файл, с которым буду работать

Отчёт по объектам.dwg

 

Первым делом вызовем таблицу (команды TABLE, ТАБЛИЦА image.png.dd6e4d10af46ccff736e841a691b2880.png) 

Теперь надо выбрать поле "Отчёт по выборке объектов"

image.png.0b416829357853fa1b42820a74840677.png

и нажать кнопку "Выбрать".

Появляется меню быстрого выбора. Тут немного остановимся.

image.png.9d3301404413f7ab2b0252eaaa695b6f.png

Давайте разберёмся как им правильно пользоваться в текущей ситуации.
Разбираемся в значках image.png.2b2ba5c0950f11a8ee478889e6e03731.png

image.png.1630faedaf340ae27bd846c7b6e40924.png - Поиск объектов во всём документе (Модель и листы)

image.png.962a144c4c1b801abeb3b0d37c84b5fc.png - Поиск объектов в текущем листе (либо модели)

image.png.2f8174bbc6a75ee378d16149420f7e84.png - Поиск в прямоугольнике

image.png.97fcdc10ab058b99589495f757366e52.png - Поиск в текущем наборе

image.png.c50b1996b19bad88b2a30c5c1bff850f.png - Указать на чертеже (сейчас серым)

image.png.03c846f7ea907f1795de1b49621027db.png - Загрузка шаблона

image.png.6a17aa14baa1b05dc177ce70fa8d74ed.png - Очистить список условий.

Первые два значка (image.png.1630faedaf340ae27bd846c7b6e40924.png и image.png.962a144c4c1b801abeb3b0d37c84b5fc.png ) в принципе вопросов не должны вызывать - при выборе параметров из меню ниже, поиск объектов будет производится во всём объектов (image.png.1630faedaf340ae27bd846c7b6e40924.png) либо в текущем листе/модели (image.png.962a144c4c1b801abeb3b0d37c84b5fc.png)


Что такое "Поиск в прямоугольнике" (image.png.2f8174bbc6a75ee378d16149420f7e84.png )? 

При выборе этой опции, будет производится поиск элементов только в указанной области. Область можно задать только одну при этом. При нажатии на кнопку у нас появится возможность задать прямоугольный участок в котором будут выбраны все объекты. Вроде бы удобно, но для первоначального создания отчёта по выборке объектов не рекомендую.
А не рекомендую вот почему - выбираем нашу область с отрезками и полилиниями и получаем следующую картину:

image.png.24c5053c650f7eed98da13b45e2f002f.png

Выбрались все наши элементы. А нам нужны только отрезки. Но вроде не велика беда, можно выбрать не нужные нам элементы (в данном случае полилинии) и, нажав на "+" убрать их из выборки выбрав строку "(Нет объекта)"

image.png.432e5431ef6d22da381dfe28e5d3261a.png

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

Конечно, мы можем просто нажать image.png.6a17aa14baa1b05dc177ce70fa8d74ed.png  и тем самым удалить все объекты из выбора, а после руками выбрать нужный, но это несколько лишних кликов и затраченное время на поиск нужных параметров из списка.

Поэтому для первоначального выбора объектов советую использовать image.png.97fcdc10ab058b99589495f757366e52.png - поиск в текущем наборе.

Эта опция позволяет выбрать конкретные объекты на чертеже.

Теперь, чтобы всё сработало корректно, выходим из создания отчёта (жмём esc), повторяем предыдущие шаги, только вместо выбора объекта с помощью image.png.2f8174bbc6a75ee378d16149420f7e84.png, выбираем image.png.97fcdc10ab058b99589495f757366e52.png .  Вас перекинет на чертёж с возможностью выбрать объекты.
Выбираем отрезок, но не любой, а сразу тот, который находится в слое "Надо сложить" (жёлтый). И вот почему:

image.png.0475d98735bf35d54e5db62b461c4839.png

Сейчас мы будем настраивать наш поиск. Мы сразу выбрали тип элемента который нам нужен, и поэтому сможем легко настроить наш поиск так, чтобы случайно не захватить другие элементы.

Первое - мы выбираем только отрезок - уже есть.

Второе - наш отрезок должен быть в определённом слое - добавляем условие - щёлкаем в столбце "Значение" напротив "Слой" и выбираем слой "Надо сложить":

image.png.12f52e42c59e416c1c4b54bd3e2234cd.png

В столбце "Условие" выбрался автоматически знак "равно" - само за себя говорящие условие)

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

 

Фильтр настроили.
Теперь важный момент - после первоначальной настройки фильтра повторный выбор объектов с помощью  image.png.2f8174bbc6a75ee378d16149420f7e84.png иimage.png.97fcdc10ab058b99589495f757366e52.png уже не будет менять фильтр. 

Так же активируется команда image.png.c50b1996b19bad88b2a30c5c1bff850f.png - Указать на чертеже. 

Попробуем её нажать. 

Нас возвращает к модели и появляется возможность выбрать объекты. Выберем все элементы на нашем чертеже. Подтвердим выбор.

Получаем следующее окно:
image.png.66b9e9bf1ad231591287be332c922d15.png

 

Что произошло?

Мы выбрали все элементы на чертеже, но из-за настроек нашего фильтра в выборку попало лишь 5 отрезков - причём наш фильтр учтиво сообщает нам, то отрезков выбрали мы всего 7, но лишь 5 из них соответствуют нашему условию.

 

Теперь ещё интересней. Нажмём на image.png.2f8174bbc6a75ee378d16149420f7e84.png - Поиск в прямоугольнике. Выбираем так же все элементы на чертеже, только уже с помощью прямоугольника.

Видим ту же самую картину:

image.png.35f1328cd0c2927c8707b76085e76485.png

 

И теперь  при нажатие на image.png.c50b1996b19bad88b2a30c5c1bff850f.png у нас появляется возможность повторно выбрать область на чертеже.

Делаем вывод, что image.png.c50b1996b19bad88b2a30c5c1bff850f.png отвечает за повторный выбор элементов ранее указанным способом.

Но в чём же отличие между  image.png.2f8174bbc6a75ee378d16149420f7e84.png иimage.png.97fcdc10ab058b99589495f757366e52.png?

С помощью  image.png.2f8174bbc6a75ee378d16149420f7e84.png - мы выбираем не объекты, а область чертежа, в котором будем искать объекты.

С помощью image.png.97fcdc10ab058b99589495f757366e52.png - мы выбираем конкретные объекты, среди которых будем искать удовлетворяющие нашему фильтру объекты (простите за тавтологию :)) .

Когда удобнее что из этого использовать, узнаем дальше.

А теперь наконец-то жмём кнопку "ОК".

Получаем следующую картину:
image.png.91d3a717619be31141ac63a70f73c2e0.png
Меню с галочками - это свойства объекта, которые будут доступны в отчёте.

Вначале ставим галочку "Изменять свойства объектов из отчёт"

image.png.3cae82ba2abca8d5f2d60c5326cfbb9f.png

Далее жмём "Ни одного", чтобы снять выбор со всех свойств и выставляем галочку на свойстве "Длина (Length)", так как мы собираемся узнавать длину =)
Жмём "ОК" и вставляем полученную таблицу на чертёж. И сразу по двойному клику заходим в неё

 

3. Работа с отчётом.

Наш отчёт:
 nCad_x5AHHYk8qU.thumb.png.0cf5a1d67648a25ad3a1a5f3a9273a32.png

Строка "Шаблон отчёта" позволяет вводить формулы, которые будут применяться ко всем элементам отчёта.

Сейчас там у нас строка "=Object.Length", которую можно прочесть так - мы выводим свойства объекта "Object", которое называется "Length"

Т.е. для всех наших 5-ти отрезков мы получили по строчке от каждого, содержащего его длину.

 

Спойлер

Возвращаясь назад к галочке напротив "Изменять свойства объектов из отчёт".

Если бы мы ей не поставили, то получили в ячейках выражение следующего вида:

=Iff(Exist(Object.Length);Object.Length;"")

Кто знаком с формулами, сразу поймёт суть этого выражения. Это выражение читается как "Если в нашем объекте существует параметр Length, то вывести его, иначе пустая строка".

Зачем нанокад создаёт такую сложную строку, вместо обычной =Object.Length? Как раз-таки чтобы мы не могли из таблицы изменить параметр "Length".

Дело вот в чём - некоторые параметры объектов, если в шаблоне они просто выведены не в формуле, можно изменять прямо из таблицы. Я в конце статьи ещё об этом скажу подробнее.

 

Если хотите узнать какому отрезку принадлежит то или иное значение, то отведите окно таблицы чуть в сторону, чтобы было видно наш чертёж и тыкните в интересующую вас ячейку:

image.thumb.png.1710d5f5a06aa58acd64c1d313991f0e.png

Видим, что зелёным подсветился отрезок, которому соответствует выбранная ячейка отчёта

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

Хорошо, у нас есть отчёт, что с ним делать?
Нам надо узнать сумму всех отрезков. Самый простой способ - взять калькулятор и сложить то, что мы видим на экране.
А если отрезков много?
Жмём на надпись "Шаблон отчёта" ЛЕВОЙ кнопкой мыши и выбираем "Итог отчёта"
image.png.c1224d63741c5814f48924b35f442d27.png

Появляется соответствующая строка в конце нашего отчёта.

Правой кнопкой мыши жмём по ней и выбираем "Сумма"

image.png.ebc5b67d0c8656d6bf36521712699ab7.png

Вуаля. Наши длины просуммировались.

 

4. Наглядная разница в выборах image.png.2f8174bbc6a75ee378d16149420f7e84.png иimage.png.97fcdc10ab058b99589495f757366e52.png

Нажмём на кнопку image.png.02a0b94891ea530872cbf3b05ab6742a.png - выбрать исходные объекты. Откроется нам уже знакомый фильтр объектов.

Увидим вверху, что у нас сейчас выбран image.png.2f8174bbc6a75ee378d16149420f7e84.png  - Поиск в прямоугольнике

Повторим наш выбор кнопкой image.png.c50b1996b19bad88b2a30c5c1bff850f.png  и выберем область аккурат по замкнутой полилинии в слое 0 на чертеже:

image.png.ad289f85c649a4fa9b585b9d87bc2b00.png

 Жмём "ОК", закрываем таблицу

Теперь давайте скопируем один из отрезкой внутри нашей выбранной области

3eBFunDJm4.thumb.gif.98b9d95e4fa28e9c3bf76f88dd59d292.gif

 

Теперь  зайдём в нашу таблицу. В моей версии отчёт придётся обновить нажав на кнопку обновить вверху окошка, либо нажав на жёлтую лампочкуimage.thumb.png.449a4665e3f9154142fa8dafce5bcf24.png

Увидим, что у в отчёте появился дополнительных объект - это копия нашего отрезка

Жмём image.png.02a0b94891ea530872cbf3b05ab6742a.png и теперь выбираем все объекты на чертеже с помощью image.png.97fcdc10ab058b99589495f757366e52.png - Поиск в текущем наборе

tUjGFkrCxL.thumb.gif.3e0c6989b6dbc1a7e21b620a6b4edf4b.gif

 

Закрываем таблицу, копируем отрезок ещё раз:

yYEA0oehJH.thumb.gif.f0962279807ca96ceb125e8d8b280818.gif

 

При обновлении таблицы видим, что новых объектов не появилось

Возвращаемся к тому, что говорилось ранее:

С помощью  image.png.2f8174bbc6a75ee378d16149420f7e84.png - мы выбираем не объекты, а область чертежа, в котором будем искать объекты.

С помощью image.png.97fcdc10ab058b99589495f757366e52.png - мы выбираем конкретные объекты, среди которых будем искать удовлетворяющие нашему фильтру объекты (опять же, извините за тавтологию :)) .

 

Т.е. в первом случае мы выбрали область и работали с объектами в этой области - поэтому при копирование отрезка внутри указанной нами области он добавился в отчёт.
Во втором случае мы работали с заранее выбранными объектами, поэтому при добавление нового отрезка на чертёж он никак не учитывался, потому что не входил в изначальный набор
Плюсы и минусы обоих способов:
1.image.png.2f8174bbc6a75ee378d16149420f7e84.png Плюс - при добавление объектов в указанную область отчёт обновляется
Минус - при копирование таблицы с помощью команды COPY, область не перемещается за таблицей, а остаётся на том же месте (хотя в каких-то случаях это и плюс):

2.image.png.97fcdc10ab058b99589495f757366e52.pngПлюс - при копирование таблицы вместе с объектом отчёта, отчёт будет привязан к скопированному объекту:

Минус - при добавление новых объектов на чертёж они ни как не учитываются в нашем отчёте.

 

5. Работа с формулами.

Уже не плохой результат, верно?
Можно, казалось бы на этом и остановиться, но.
Предположим ситуацию, что нам надо сложить длины отрезков разных слоёв по-отдельности. Для каждого типа делать новую таблицу? Как вариант. Но, предположим, что таких типов будет 30?
Тут приходят на помощь формулы и группировка строк.

Удалим фильтр наших объектов по слоям.

Жмём image.png.02a0b94891ea530872cbf3b05ab6742a.png и в строке "Слой" в значение выбираем "Сброс"

mlBnveaJeJ.thumb.gif.9a70ec14094097fd45824c0d6158aa1a.gif

 

Теперь в наш отчёт включены все отрезки, не важно в каком они слое.
Добавим столбец (ПКМ по заглавию столбца А -> "Добавить столбец")

qUBTgt3QgL.thumb.gif.0f3144c02c81691249761ead1e618169.gif

 

Теперь в полученном столбце B жмём ПКМ в 1 строке (строка шаблона отчёта) и выбираем из предложенных вариантов Object.Layer(Слой)

XRyogxjCyu.thumb.gif.49c9e5fa3c28471fc579aaba2466feae.gif

 

Получаем информацию для каждого нашего отрезка по-мимо его длины ещё и слой в котором он находится.
Теперь заходим в "группировку и объединение" image.png.5edb2fd0756972d088091865d387c0bd.png   

Добавляем правило "Группировать" и закидываем сюда из окошка справа столбец B

YLA786e5Sy.thumb.gif.a1df4d6894500fa087646c34d7209e21.gif

 

Видим, что наш отчёт преобразился.
Что произошло?
Наш отчёт сгруппировался по значениям в столбце B - это значит, что сгруппированные ячейки теперь в себе несут сразу все элементы по тому критерию, по которому мы их сгруппировали.
Проверим это, тыкнув на любую из ячеек, чтобы подсветить элементы на чертеже:

Спойлер

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

 

А теперь магия.
Жмём ПКМ по строке шаблона отчёта в столбце А и выбираем "Выражение"
XYja18n3fP.thumb.gif.cc0b33a628a944bc7be114edbad7dc05.gif

 

Нас перебрасывает в специальное окно, предназначенное для написания формул.
Что мы тут видим
1. Наше записанное выражение
2. Подсказки по существующим формулам и выражениям
3. Результат нашего выражения
image.png.5ccb17127e20cb6e6f84f4ee27a57562.png

 

Результат записан несколькими значениями, потому что у наших элементов (отрезков) показатели длины разные. 

Теперь самое сложное.
Вспомним, что мы сгруппировали строки по значениям в столбце B.
Т.е. по факту напротив столбца B в столбце А у нас не одно значение, а множество значений элементов, свойства слоя которых соответствуют значению в столбце B.

 

Спойлер

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


Простыми словами на нашем примере - напротив значение слоя "Надо сложить" в столбце А у нас не одна длина отрезка, которую мы видим, а несколько.

image.png.0258cbb38f330845dad68720be292126.png

 

Поэтому, если мы запишем нашу формулу не просто как:

=Object.Length

а как:

=sum(Object.Length)

В ячейка напротив слоя мы получим значение сумм всех отрезком в данном слое

 

Как итог "итог отчёта" нам уже и не нужен.
Теперь просто наведём красоту и переведём единицы измерения отрезков в метры - разделив на 1000 и округлим до 2-го знака после запятой.
Для этого нашу формулу преобразуем в:

=round(sum(Object.Length)/1000;2)

 

Для того, чтобы подробнее узнать как правильно писать ту или иную формулу и что они делают, открываем "Выражение" и смотрим подсказки:

 

6. Важное дополнение

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

Это, к сожалению, не работает с примитивами платформы (отрезки, полилинии и т.п.) и нативными свойствами объектов (слой, цвет и т.п.).
Я в основном использую для изменения свойств параметрических объектов, а так же атрибутов блоков
К примеру - изменения номеров штампов по положения в прострастве чертежа:

Так же  знаю, что в новых версиях продукта были добавлены функции, которые позволяют автоматически изменять параметры объектов - одно из применений этих функций - это автоматическое обновления позиций объектов, при добавление новых элементов

 

Советую так же, после того, как овладеете отчётами, познакомиться с командами 

SPTBLPREP - если ввести эту команду и выбрать таблицу, позволит повторно выбрать для этой таблицы объекты отчёта (не надо заходить в редактор таблицы)

SPREFSHOW - при выборе таблицы, простроит линии связей между строками отчёта и элементами

spDataExtraction  - позволяет делать отчёт по элементам находящимся на другом чертеже.

А функции 

SPTBLPLUSFRAME - привязать таблицу к формату 

SPTBLMINUSFRAME - отвязать таблицу от формата

будут в принципе полезны при работе с таблицами. Угол привязки таблицы к формату указываются через свойство таблицы "Угол вставки".

 

На этом всё. Надеюсь смог познакомить вас с отчётами в таблицах. Таблицы нананокад, а особенно эти самые отчёты, -  очень мощный инструмент, и при правильном пользование могут сэкономить вам кучу времени. На данный момент, я работаю с нанокадам в течение уже 6-ти лет, и использую таблицы повсеместно - от подсчёта кладки на чертеже, до автоматического заполнения ТЭПов и спецификаций элементов.

 

 

 

 

 

dromandon

В продолжение этого урока "Отзеркаливание текста в параметрическом объекте"

Работать будем с получившимся объектом в предыдущем уроке и будем его упрощать и дорабатывать.

На самом деле, действий не так много придётся совершить =) Благодаря случайности обратил внимание, что у всех объектов разница углов между vecDirection и осью oZ, и vecPlane и осью o Z будет всегда равна 90 градусов. Только у неотзеркаленых она положительная,А у отзеркаленых - отрицательная

Давайте проверим это и добавим два параметра в наш объект:

	rAngleZ1, "Угол Z (Direction)", 
	rAngleZ2, "Угол Z (Plane)", 

Так же добавим их в функцию MirrorObject:

	rAngleZ1 = angleTwoPi(vecDirection,oZ);
	rAngleZ2 = angleTwoPi(vecPlane,oZ);

и закомментируем наши rAngleX и rAngleY в функции MirrorObject, чтобы не производилось отзеркаливание объекта.

Достаём объект из базы, поворачиваем его всячески и зеркалим, убеждаясь в словах выше:

Спойлер

 

Видим, что по-мимо углов в 90 и -90 градусов присутствует углы в -270 и 270 градусов соответственно, причина этому то, что когда величина угла достигает 360 градусов она сбрасывается на 0,  и получается, что 10-280=-270,но при этом 370-280=90.

Не забываем отразить это в нашем коде.

Для удобства в  функции MirrorObject добавим переменную a равную a=rAngleZ1-rAngleZ2

Пишем в функции MirrorObject:

	rAngleZ1 = angleTwoPi(vecDirection,oZ);
	rAngleZ2 = angleTwoPi(vecPlane,oZ);
	a=rAngleZ1-rAngleZ2;
	if(a==-90 || a==270)
	{
		vecDirection=-vecDirection;
	}

Теперь наш объект зеркалится обратно, но остаётся проблема с поворотом текста

Для поворота текста будем работать с переменной rAngleY, "Угол Y", поэтому надо её расскомментировать.

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

У меня он получился от  90<rAngleY<=270

Исходя из этого, обновляем нашу функцию следующим образом, тем самым приводя её к итоговому виду

	rAngleY = angleTwoPi(oY,vecPlane);
	rAngleZ1 = angleTwoPi(vecDirection,oZ);
	rAngleZ2 = angleTwoPi(vecPlane,oZ);
	a=rAngleZ1-rAngleZ2;
	sTextAngle=0;
	if(a==-90 || a==270)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleY>90 && rAngleY<=270)
	{
		sTextAngle=180;
	}

 

Обновляем наши объекты и наслаждаемся результатом =)

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

dromandon

Растягивание объекта за базовую точку (pntOrigin)


Параметрические объекты

В этой небольшой статье рассмотрим как можно отредактировать стандартный параметрический объект, чтобы за базовую точку объекта можно было не переносить объект, а растягивать. Это удобно будет при работе со швеллерами, трубами и прочими объектами, которые приходится растягивать в обе стороны.
Для примера будет использовать стандартный параметрический объект трубу по ГОСТ 167-69 (Несущие конструкции -> КМ -> Трубы)

Нас интересует функция OnMoveGripPoint

По умолчанию она выглядит так:

function OnMoveGripPoint{
	if(NMovingGrip == 1){
		L = vecLen(pntGrip0 - pntGrip1);
		vecDirection = pntGrip1 - pntGrip0;
		LoadInCache( B, s );
		SelectInCache( "kFirst", "B", "~", B,  "s", "~", s);
	} else {
		pntOrigin = pntGrip0; 
	};
}; 

 

Давайте для удобства приведём к более понятному виду и уйдём от конструкции else

function OnMoveGripPoint
{
	if(NMovingGrip == 0)
	{
		pntOrigin = pntGrip0; 
	};

	if(NMovingGrip == 1)
	{
		L = vecLen(pntGrip0 - pntGrip1);
		vecDirection = pntGrip1 - pntGrip0;
		LoadInCache( B, s );
		SelectInCache( "kFirst", "B", "~", B,  "s", "~", s);
	};
}; 

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

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

Получаем:

	if(NMovingGrip == 0)
	{
		pntOrigin = pntGrip0; 
		L = vecLen(pntGrip1 - pntGrip0);
	};

Ура, наш объект растягивается!)
Осталось дописать поведение вектора направления объекта:

	if(NMovingGrip == 0)
	{
		pntOrigin = pntGrip0; 
		L = vecLen(pntGrip1 - pntGrip0);
		vecDirection = pntGrip1 - pntGrip0;
	};

И всё, теперь всё работает просто великолепно)

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

 

Спойлер

 

dromandon

Небольшая статейка о том, как сделать, чтобы при отзеркаливание параметрического объекта СПДС не зеркалился текст прописаный в геометрии объекта (UText)
Ответ прост - никак :D

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

Спойлер

MTEvOQA2R8.gif.68f408b1dec328edf836e0ec9e5b7957.gif.a4092fee4615478628e2fdad6887cc4f.gif

 

Тогда что же делать?
Во-первых, мы не будем создавать вид сзади. Мы заставим объект отзеркалиться обратно!
Что нам для этого надо:
1. Заставить объект понимать, что он отзеркален.
2. Заставить объект, если он отзеркален, зеркалить себя обратно.

3. Заставить объект переместить себя на нужное место.
 

Решаем первую задачу

Мой объект -  Пример для отзеркаливания текста (пустышка).mcd

Вводим две переменные в объект:
rAngleX (назовём её "Угол X") и rAngleY (назовём её "Угол Y")

для переменной "Угол X" вычисляем угол между глобальной осью oY и вектором нашего объекта vecDirection

rAngleX = angleTwoPi(oY,vecDirection);

Для "Угол Y" вычисляем угол между осью oY и вектором нашего объекта vecPlane

rAngleY = angleTwoPi(oY,vecPlane);

 

Создаём функцию MirrorObject вначале нашего кода и прописываем там наши формулы

 

function MirrorObject
{
	rAngleX = angleTwoPi(oY,vecDirection);
	rAngleY = angleTwoPi(oY,vecPlane);
}

 

Прописываем нашу функцию в функциях OnInitialization, чтобы инициализировать  при вставке объекта наши переменные, и в OnMakeParameters, что при обновление объекта с помощью команды SPREGENSTD наши параметры обновились (на видео я запускаю эту команду через кнопку)
 

Спойлер

 

Из видео видно, что если мы зеркалим объект по оси Y то
Угол X = 90

Угол Y = 0

 

А если по X, то

Угол X = 270

Угол Y = 180

 

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

 

Тут всё просто, на самом деле)

Прописываем iff'ы, которые при определённых значения rAngleX и rAngleY будут разворачивать наш объект

И загоняем их в нашу функцию  MirrorObject

Рассмотрим момент, когда мы зеркалим по оси Y.

Что происходит в этот  момент с объектом?
У него меняется направления вектора vecDirection. Значит, чтобы отзеркалить объект обратно, нам надо для начала поменять направления вектора vecDirection!
пишем:

if(rAngleX==90 && rAngleY==0)
{
	vecDirection = -vecDirection;
}

А при зеркале по оси X меняется направление vecPlane, как следствие:

 

if(rAngleX==270 && rAngleY==180)
{
	vecPlane= -vecPlane;
}

 

Загоняем это в нашу функцию

function MirrorObject
{
	rAngleX = angleTwoPi(oY,vecDirection);
	rAngleY = angleTwoPi(oY,vecPlane);
	if(rAngleX==90 && rAngleY==0)
	{
		vecDirection = -vecDirection;
	}
	if(rAngleX==270 && rAngleY==180)
	{
		vecPlane= -vecPlane;
	}
}

Сохраняем объект и обновляем его на чертеже
 

Спойлер

 

О чудо, всё заработало!)

Но ещё рано радоваться, проверяем разные случаи и получаем:

Спойлер

 

Логика та же, что и раньше, дописываем iff'ы исходя из угла)

 

function MirrorObject
{
	rAngleY = angleTwoPi(oY,vecPlane);
	rAngleX = angleTwoPi(oY,vecDirection);
	if(rAngleX==90 && rAngleY==0)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==270 && rAngleY==180)
	{
		vecPlane=-vecPlane;
	}
	if(rAngleX==0 && rAngleY==270)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==180 && rAngleY==90)
	{
		vecPlane=-vecPlane;
	}
}

Запись специально не упрощал, но вы можете, если хотите,  объединить через "или" (||) часть кода)

Проверяем результат:

Спойлер


Текст не зеркалится, но крутится.

Чтобы решить эту проблему, надо ввести переменную, отвечающую за поворот текста.

В ActHeader в Public дописываем переменную 

sTextAngle, "hidden" 

я её скрыл, потому что вручную менять не планирую, если хотите, можете оставить открытой.

А коде исполнения UText дополняем переменной нашего угла:
 

UText(mp, DegToRad(sTextAngle), 2.5*rSymScl/rScl, 0, 0.0000, T, 1,1);

Я буду работать с углом в градусах

 

Далее мы определяем в каких значения Угла X и Угла Y у нас текст повёрнут и выставляем для этого случая нужное нам значение sTextAngle, тем самым формирую итоговый вид нашей функции:
 

function MirrorObject
{
	rAngleY = angleTwoPi(oY,vecPlane);
	rAngleX = angleTwoPi(oY,vecDirection);
	if(rAngleX==90 && rAngleY==0)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==270 && rAngleY==180)
	{
		vecPlane=-vecPlane;
	}
	if(rAngleX==0 && rAngleY==270)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==180 && rAngleY==90)
	{
		vecPlane=-vecPlane;
	}
	
	if(rAngleY==180 || rAngleY==270)
	{
		sTextAngle=180;
	}
	else
	{
		sTextAngle=0;
	}
}

Сохраняем и обновляем наши объекты:

Спойлер

 

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

anY = angleTwoPi(oY,vecPlane);
anX = angleTwoPi(oY,vecDirection);
pnt1x = pntOrigin:x;
pnt1y = pntOrigin:y;
if (anX==180 && anY==90)
{
	pntOrigin:x = pnt1x - L;
	vecPlane=-vecPlane;
}
if (anX==90 && anY==0)
{
	pntOrigin:x = pnt1x - B;
	vecDirection=-vecDirection;
}

Примеры моих объектов, с применение данной логики для отзеркаливания:

Спойлер
Спойлер

 

dromandon

Макросы

Мы с вами уже настроили горячие клавиши, научились пользоваться пробелом и быстро выбирать то, что нам нужно
Но есть рутинные задачи, в которых нас не спасают ни быстрый выбор, ни быстрый ввод команды. Потому что приходится раз за разом выполнять одно и то же действие над разными объектами.
Допустим, получили вы чертёж Фасада. Хорошо оформленный чертёж, 1 к 100, все отметки стоят, всё отлично. Только вот незадача, он на А1 не помещается. Надо бы изменить масштаб чертежа. А это надо все отметки в 2 раза увеличить, ведь они сделаны из линий и текста, увы.
И поехали - выделили одну отметку -> SCALE -> Указали базовую точку -> Указали нужный масштаб (2).
И повторили.
И так раз 100.
Удручающая задача, которую надо сделать и особо никак не вывернешься.
Тут приходят на помощь макросы. 
Самое понятное определения макроса - это последовательность команд, которые вы привязываете к кнопке.
Тем самым вы можете сократить эти действия:
Выделили одну отметку -> SCALE -> Указали базовую точку -> Указали нужный масштаб (2) ->Выделили одну отметку -> SCALE -> Указали базовую точку -> Указали нужный масштаб (2).

До данных:

Команда -> Выделили одну отметку -> Указали базовую точку -> Выделили одну отметку -> Указали базовую точку .

Уйдёт ввод с клавиатуры "2", уйдёт повтор команды (потому что макрос будет зациклен)

Спойлер
Спойлер

Да, по-прежнему придётся выделить все отметки по отдельности, но вместо условных 32 секунд на 10 отметок , у нас ушло 18.
(32-18)х(100/10)=140 секунд, т.е. мы сократили время работы в идеальных условиях чуть более, чем на 2 минуты.
В принципе, со знанием, как писать макросы, этого времени достаточно, чтобы написать такой макрос.
Стоит ли игра свеч решать вам, по итогу все макросы, которые я писал для себя, мне понадобились не единожды ;)

 

Делюсь парочкой простых макросов, которыми пользовался в своё время

Уменьшить в 2 раза = *^C^C_Scale;\\;\0.5

Увеличить в 2 раза = *^C^C_Scale;\\;\2

Подобие с удаление оригинала - *^C^C_offset;_e;_y; (из-за этой команды макрос обычного подобия переделал в  - ^C^C_offset;_e;_n; )

Отражение с удаление оригинала - *^C^C_mirror;\\;\\_y;

Очистка чертежа (от неиспользуемых блоков, слоёв и т.п.) - ^C^C_-Purge;_all;;_no;

Масштаб с опорной линией - ^С^C_scale;\\;\_r;@;\\

Включить границы отображения раста - ^C^C_imageframe;1;

Выключить границы отображения раста - ^C^C_imageframe;0;

Включить границы отображения границ маскировки - ^C^C_wipeout;_f;_on;

Выключить границы отображения границ маскировки - ^C^C_wipeout;_f;_off;

Повернуть с базовым углом - ^C_rotate;\\;\_r;@;\\

 

Где прописывать макрос?
Показываю на примере АК 2013 года (в моей версии наны нет макросов, в новых должно быть похоже)

Спойлер

 

Как именно писать макросы и что обозначают все эти слеши и точки с запятыми я не буду, да и, к сожалению, давно не писал их (работаю в Нанокад СПДС 6.0, он, к сожалению моему великому, макросы не поддерживает), но в интернете прилично материала на эту тему, думаю, первая же ссылка в гугле по запросу "макросы в автокаде" вам сразу же поможет ;)

На мой взгляд, создание макроса, является самым простым "продвинутым" инструментом для освоения, который стоит изучить для максимально эффективного использования CAD программ.

Значки для кнопок.zip

dromandon

Хочу поделится несколькими способами быстро выбрать нужные вам объекты, по-мимо стандартного "Быстрого выбора"
 

1. Выбрать похожие объекты (SELECTSIMILAR)

Эта команда позволит вам выбрать все объекты на чертеже со свойствами, соответствующим выбранным объектам.
Какие свойства брать за основные выбирать вам, для этого после ввода команды выбираем "настройки" и выставляем требуемые параметры

 

2. Изолировать слой (LAYISO)

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

 

3. Сохранить шаблон

Данная функция доступна при быстром выборе объектов. Полезна, когда по большому количеству фильтров приходится выбирать объекты на чертеже по несколько раз.

Спойлер

 

4. ФИЛЬТР
Данную функцию обнаружил в Автокад ЛТ 2011. Точно есть в 13 версии продукта. Думаю перекочевала и в новые версии. Есть ли в Нанокадах новых не знаю, в моей версии точно нет.
Суть примерно та же, как и у быстрого выбора в Нанокаде. Тоже можно сохранять шаблоны. Последний настройки сохраняются. Хорошая альтернатива быстрому выбора в АК.

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

Спойлер

 

5. Предыдущий выбор (SELECT13)

Данную функцию как отдельную команду встретил впервые в своей версии нанокада. До этого в Брикскаде 13-го года и Автокаде 13 этой команды не находил. Для автокада пришлось писать макрос, который отдалённо воспроизводил эту функцию, но с рядом ограничений.
Команда, собственно, повторяет последний выбор объектов ^_^

dromandon

Слои

Кратко в общих чертах:

Работайте в слоях!
Если что-то можно выделить в отдельный слой - выделяйте!
Называйте как хотите эти слои, вам работать с ними дальше, но лично я бы советовал называть все слои таким образом, будто кто-то другой будет работать с вашим чертежом, тогда и вам самим будет всегда понятно, что вы имели ввиду, называя слой данным образом.

Меняйте толщины линии с "по слою" на любую другую величину только по острой необходимости.
Работайте таким образом, чтобы в будущем сделанную вами работу вы смогли сами изменить в пару кликов.


А теперь подробнее :)

Я расскажу несколько моментов в работе со слоями, которые используют не все.

Слои 2

Вытащите эту панельку себе, пускай всегда будет под рукой.
Из полезных функций на ней, к которым я обращаюсь довольно часто, это:
 - Отключить слой - отключает слой в котором находится выбранный элемент

 - Заморозить слой - замораживает слой в котором находится выбранный элемент

 - Включить все слои
 - Разморозить все слои

 - Конфигурации (см. дальше)
 

Чем отличается "отключение слоя" от "заморозки". Если я верно понял эти операции, то "отключение" просто скрывает объекты - они продолжают существовать на чертеже, просто мы их не видим. Заморозка же убирает элементы с чертежа.

Как это? 

Отключите какой-то слой. Нажмите сочетание клавиш ctrl+A - вы выделите все объекты, даже те, которые находятся на отключённых слоях.

Теперь попробуйте вместо отключения заморозить слой. При нажатие ctrl+A данный слой не выделится.

Спойлер

Как это использовать решайте сами. Я в основном удаляю таким образом ненужные мне объекты с чертежа :ph34r:

Ещё пример.

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

Спойлер

 

Но это всё мелочи, подходим к сладкому. Почему-то я не знаю пока никого у себя в городе, кто бы этим пользовался. Может город маленький просто, а может я людей знаю мало :unsure:

 

Конфигурации слоёв

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

Поэтому ещё раз - конфигурации слоёв.

Делаете кладочные и отделочные планы на одном и том же плане этажа? Вы просто обязаны иметь как минимум две конфигурации - Кладка и Отделка.
Как настроить?
Очень просто - настраиваете требуемое отображение слоёв - СЛОИ - Добавить конфигурацию. Всё, осталось лишь назвать конфигурацию должным образом.

Спойлер

 

При этом в конфигурациях сохраняется не только включён или отключён ли слой, но его печатаемость, цвет, толщина и другие настройки

Спойлер

 

Спойлер

 

Группы слоёв

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

 

Бонус. Свойства слоя "0".

Хотел бы ещё рассказать вам про слой "0". У этого слоя есть особое свойство, отличающие его от других - если объект вычертить в нулевом слое и загнать его в блок, то он примет свойства слоя, в котором находится данный блок. Как это использовать - решайте сами;)

Спойлер

 

dromandon

Пробел

Чтобы не уходить далеко от темы горячих клавиш расскажу про пробел.
Как вы, наверное, знаете, основная функция пробела аналогична нажатию клавиши Enter и служит для повтора последней команды и завершения текущей.
Но есть ещё несколько функций, о которых знают не все.
Все они выполняются, если выбрать базовую точку объекта и нажать на пробел определённое количество раз.

Спойлер
Спойлер
Спойлер
Спойлер


 Использование данной функции пробела было для меня первым звоночком к переходу к горячим клавишам.
Стоит ещё дополнительно к функции переноса при однократном нажатие пробела добавить функцию копирования. Она не доступна в моей версии нанокада, не уверен насчёт более новых версий. Поэтому показываю на примере Автокада лт 2013 (знаю, что в 2011 АК тоже так можно)
Выполняется это при однократном нажатие на пробел, после чего зажимаете ctrl и указываете место в прострастве.
Если продолжите удерживать ctrl, получите массив 

Спойлер

 

Можете, конечно, спросить меня - зачем мне этот пробел, когда у меня есть горячие клавиши?
Справедливо :o
Но, допустим, попробуйте перенести штриховку за базовую точку с помощью горячей клавиши? Собственно хотя бы для этого :D

dromandon

Это первый и один из самых важных советов при работе в любой программе, не только Cad - используйте горячие клавиши.
Да, вначале будет неудобно. Да, вы можете со мной до усрачки спорить и доказывать, что вам удобнее мышкой тыкать по иконкам. Да, вам может казаться, что прироста в скорости горячие клавиши вам не дадут. Я сам так думал. Но в один момент я заметил, что очень часто вижу упоминание горячих клавиш на разных форумах, в статьях и книжках. И заставил себя переучится.
Было сложно. Я выбрал самые используемые на мой взгляд команды в Cad и забил их на сочетание клавиш с Shift'ом. Придал этим сочетанием какую-то логику и начал работать... Но рука всё равно тянулась к иконкам. Раз за разом. Тогда я просто удалил иконки и не оставил себе выбора, кроме как вводить команды с помощью комбинаций клавиш.
На данный момент я не представляю, как я раньше работал без данного функционала. Это всё равно, что всеми известные "Ctrl+Z" или "Ctrl+С" нажимать через иконки. И в каждой новой программе, после некоторого использования её, я назначаю для самых повторяемых команд свои сочетания.

Я работаю сейчас в Nanocad СПДС 6.0, вот мои сочетания:
Shift +
Q - Копирование свойств 
W - Размеры 

E - Обрезать (Данная команда при выборе обрезаемого объекта с зажатым Shift работает как удленить)

R - Повернуть

A - Копирование

S - Зеркало
D - Перенести

F - Растянуть
G - Фаска
Z - Отрезок
X - Прямая
C - Полилиния
V - Прямоугольник.
 

Из этого списка, самой менее используемой мною командой оказалось "Повернуть" .

×
×
  • Создать...