NANOCAD ШОУ
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP. Плагин создания кабельных линий и генерации КЖ раздела КИПиА. Протестировано на AutoCAD 2015...2018 и офис 2013...2016

LISP. Плагин создания кабельных линий и генерации КЖ раздела КИПиА. Протестировано на AutoCAD 2015...2018 и офис 2013...2016

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 21.06.2017, 02:40 1 | #1
LISP. Плагин создания кабельных линий и генерации КЖ раздела КИПиА. Протестировано на AutoCAD 2015...2018 и офис 2013...2016
petro_f
 
Регистрация: 06.10.2016
Сообщений: 55

petro_f вне форума Вставить имя

Плагин кабельных трасс с автоматическим подсчётом длины кабеля и внесением данных по типу прокладки кабеля.

В плагине реализованы функции:
  1. Создания кабельного блока с "цифровой подписью" созданного блока, с внесением информации по типу прокладки:
    • Создание кабельных блоков (кабеля) из линий, полилиний, дуг и сплайнов с автоматическим подсчётом длины кабеля. Ручным и полуавтоматизированным (из таблицы) вводом информации по кабелю и типу и количеству "упаковки" кабеля.
    • Создание новых кабелей на базе существующего кабеля с внесением новой информации по кабелю.
    • Пакетное создание кабелей на базе существующего кабеля с внесением новой информации по кабелям.
  2. Проверки и верификации существующих кабелей.
  3. Проверки и редактирования информации после ручной правки кабеля.
  4. Пакетного редактирования существующих кабельных трасс с фукциями:
    • Обрезки кабелей по заданной линии.
    • Добавления трассы к кабелю.
    • Пересчёта информации по длине вновь получившегося кабеля и пересчёта длины "упаковки" кабельной линии.
    • Объединения соприкасающихся линий трассы, для корректной обрезки кабеля при редактировании.
    • Смены "базовой точки" кабельного блока после редактирования.
  5. Замены существующей трассы кабеля на новую трассу с взятием информации от заменяемого кабеля.
  6. Пакетного переименования кабелей с указанием информации для переименования в виде таблицы.
  7. Экспорта данных для создания (редактирования) кабелей и кабельного журнала с возможностью:
    • Экспорта в программу Word с оформлением кабельного журнала (форматы А3, А4 вертикалый, горизонтальный).
    • Экспорта в програму Excel с функцией контроля длинн упаковки кабели и длины самого кабеля.
    • Экспорта в таблицы AutoCAD с разбивкой на листы с учётом рамки и штампа (большого и малого).
    • Технического экспорта в AutoCAD данных по кабелю из специальных кабельных блоков (с электрических схем).
    • Технического экспорта данных по кабелю в кабельные журналы Word (без указания длинн и типа упаковки).
    • Технического экспорта данных по кабелю в программу Excel (без указания длинн и типа упаковки).
  8. Импорта данных для создания кабелей с возможностью:
    • Импорт из программы Word с оформленного КЖ (форматы А3 и А4, вертикальный и горизонтальный) с преобразованием полученных данных в формат таблицы AutoCAD.
    • Импорта в AutoCAD данных по кабелю из специальных кабельных блоков (с электрических схем).
  9. Маркировки существующик кабелей на планах. Маркировка может быть осуществлена:
    • Мультивыноской - для единичных кабелей в месте маркировки.
    • Табличкой с именами кабелей - для множества кабелей в месте маркировки.
    • Табличкой с именами кабелей со стрелкой из мультивыноски - для множества кабелей в месте маркировки.
  10. Поиска и выделения существующих кабелей для дальнейшей работы с ними.

Ссылки на GIF-ки:
Создание кабеля с извлечением информации из блоков кабелей на электрической схеме
Создание копии кабеля на базе существующего кабеля
Создание множественных копии кабеля на базе существующего кабеля
Замена трассы уже существующего блока кабеля
Пакетное редактирование кабелей
Пакетное переименование кабелей КЖ
Маркировка кабеля на планах
Экспорт импорт КЖ


Основной файл плагина составляет файл PDKFKG.lsp расположенный по пути C:\PDKFKG\0_LISP.
Имя папки, её расположение и основные настройки плагина редактируются в двух файлах в разделе основных настроек (там везде даны подсказки):
  • Файл плагина PDKFKG.lsp расположенный по пути C:\PDKFKG\0_LISP - строки с 38 по 76 для версии плагина [>= v 14.20]
  • Файл загрузки плагина 0_PDKFKG_LOAD.lsp расположенный по пути C:\PDKFKG - строки с 1 по 13 для версии плагина [>= v 14.20]

Для загрузки плагина в AutoCAD необходимо распаковать архив PDKFKG.rar в корневую директорию диска C: (если Вы хотите распаковать в другую директорию, то не забудьте внести эти изменения в перечисленные выше файлы) и из получившейся папки C:\PDKFKG всего один раз загрузить файл загрузки плагина 0_PDKFKG_LOAD.lsp.
После загрузки появится две плавающих панели с иконками. Малая панель с "выпадающими" иконками дублирует большую панель и может быть без болезненна отключена. Данная панель предназначена для работы на маленьких мониторах и позволяет не занимать много места.

Расшифровки действующих функций даны при первой загрузке плагина (в консольную строку AutoCAD), а так же полностью указаны в всплывающих хелп-сообщениях при наведении и удержании курсора над иконками функций на панели плагина.

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

Для замены иконок по своему вкусу в файле PDKFKG.mnu по пути C:\PDKFKG можно заменить на свои, или как вариант просто подменить файлы иконок и удалив файл PDKFKG.cuix заново открыть AutoCAD.

При старте плагина меняются или проверяются следующие переменные:
  • USERR1 - проверяется что не равна 0.0 Отключить можно закомментировав или удалив строку 6 в файле PDKFKG.mnl по пути C:\PDKFKG
  • DIMSCALE - проверяется что не равна 0.0 Отключить можно закомментировав или удалив строку 7 в файле PDKFKG.mnl по пути C:\PDKFKG
  • CANNOSCALEVALUE - проверяется что не равно 0.0 Отключить можно закомментировав или удалив строку 8 в файле PDKFKG.mnl по пути C:\PDKFKG
  • MENUBAR - переводится в 1 для отображения строки плагина. Отключить можно закомментировав или удалив строку 9 в файле PDKFKG.mnl по пути C:\PDKFKG

Журнализация изменений проекта changelog:
  1. В версии [>= V 14.21] поправил переменную масштабирования, которая идёт в файле по умолчанию. Теперь для расчёта масштаба используется переменная DIMSCALE. Поправил оформление функции wcmatch и убрал не действующие строки - на работе плагина это никак не отразилось.
  2. В версии [>= V 14.22] переформатировал выводимое меню плагина. Сгруппировал команды и уточнил описания команд.
  3. В версии [>= V 14.24] добавил сводную таблицу по количеству кабеля. Табличка нужна для внесения данных в спецификацию проекта. Сводная таблица вставляется в таблицу "Таблица прокладки кабеля".
  4. В версии [>= V 14.25] Поправил заливку ячеек таблички при изменении имени кабеля в функциях "PDKFKGCPY" и "PDKFKGMCPY".
  5. В версии [>= V 14.30] Добавил функцию пакетного обмена упаковки кабеля "PDKFKGPACKSWAP". Например кабель был уложен в гофре, а заказчик захотел заменить на ПВХ-трубу. Эта функция как раз позволит сделать это для выбранных блоков разом.

P.S. Для получения последней версии надо скачать файл с исходным плагином (если он у Вас ещё не установлен), и файл обновления. Распаковать и заменить (добавить) все содержащиеся в обновлении файлы. Далее работать по исходной инструкции настройки, установки плагина.

Вложения
Тип файла: zip Ссылки ГИФ.zip (2.6 Кб, 48 просмотров)
Тип файла: dwg
DWG 2013
Планы с кабелями для тестов с пояснением по блоку.dwg (900.2 Кб, 58 просмотров)
Тип файла: rar PDKFKG_V14_25.rar (74.3 Кб, 29 просмотров)
Тип файла: rar PDKFKG.rar (440.5 Кб, 25 просмотров)
Тип файла: rar PDKFKG_V14_30.rar (77.8 Кб, 12 просмотров)

__________________
Если ты разговариваешь с идиотом - убедись что он не занят тем же!

Последний раз редактировалось petro_f, 29.10.2017 в 21:23. Причина: Добавление нового функционала плагина (29.10.2017).
Просмотров: 4913
 
Непрочитано 21.06.2017, 13:53
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 4,037


Что за тяга по умолчанию в корневой каталог системного диска ставить программу? Причем программу, которая по сути не требует прав выше пользовательских - насколько понимаю.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 21.06.2017, 14:02
| 1 #3
petro_f


 
Регистрация: 06.10.2016
Сообщений: 55


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Что за тяга по умолчанию в корневой каталог системного диска ставить программу? Причем программу, которая по сути не требует прав выше пользовательских - насколько понимаю.
Сергей, тяги никакой нет, но если бы Вы внимательно читали текст, то увидели бы, что это не обязательно...
Написано вроде чётко и понятно...
Цитата:
Сообщение от petro_f Посмотреть сообщение
Имя папки, её расположение и основные настройки плагина редактируются в двух файлах в разделе основных настроек (там везде даны подсказки):
Файл плагина PDKFKG.lsp расположенный по пути C:\PDKFKG\0_LISP - строки с 38 по 76 для версии плагина [>= v 14.20]
Файл загрузки плагина 0_PDKFKG_LOAD.lsp расположенный по пути C:\PDKFKG - строки с 1 по 13 для версии плагина [>= v 14.20]
Просто мне так уж исторически сложилось, что удобней кинуть туда папку было.
__________________
Если ты разговариваешь с идиотом - убедись что он не занят тем же!
petro_f вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.06.2017, 19:27
#4
Erbol2014

ТОО
 
Регистрация: 22.05.2014
Аршалы
Сообщений: 50


Я дико извиняюсь, но ваш файл "Планы с кабелями для тестов.dwg " имеет внутри макрос....
Вы нам трояна втюхать хотите? С трояном это в лабораторию касперского https://www.youtube.com/watch?v=nURH6dKb9ac
А рамку чертежа специально из "кусков" делаете, чтобы жизнь усложнить ?
Erbol2014 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.06.2017, 19:42
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,908


В качестве намека, где и как можно хранить подобные вещи: http://autolisp.ru/2011/04/11/data-set-and-get-03-2/
При первом запуске запрашивать каталог установки и записывать полученные данные, а потом просто к ним обращаться.
Offtop: P.S. Предоставление "готовой" программы обычно не подразумевает правки исходного кода.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.06.2017, 20:24
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 4,037


И использование в качестве кабеля вместо полилинии с расширенными данными (например) блока с атрибутами очень спорное решение, имхо.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 21.06.2017, 20:28
#7
petro_f


 
Регистрация: 06.10.2016
Сообщений: 55


Цитата:
Сообщение от Erbol2014 Посмотреть сообщение
Я дико извиняюсь, но ваш файл "Планы с кабелями для тестов.dwg " имеет внутри макрос....
Уважаемый где и что Вы там нашли? Всё что у меня загружено это взято тут, SelSim и GeomProps.
Единственное я не сильно проверял подложку от нашего отдела АР, но и там сидят спецы не пальцем деланные.... Так что просто не загружайте ничего и да будет Вам счастье...

Цитата:
Сообщение от Erbol2014 Посмотреть сообщение
А рамку чертежа специально из "кусков" делаете, чтобы жизнь усложнить ?
Мне так удобнее и её я Вам и не предлагаю Меня данная рамка устраивает на 146%


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В качестве намека, где и как можно хранить подобные вещи: http://autolisp.ru/2011/04/11/data-set-and-get-03-2/
При первом запуске запрашивать каталог установки и записывать полученные данные, а потом просто к ним обращаться.
Я конечно Вас уважаю, но лезть в реестр по всякому поводу считаю глупой затеей. Не у всех в корпоративной политике есть разрешение на доступ программ к реестру. Я понимаю, что кад и так там ковыряется, но мне проще в самом исходном файле внести один раз настройку. Зато потом при переносе, переустановки системы ничего не надо трогать.. как то так.. я из старых DOS-ников и винде не сильно доверяю

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop: P.S. Предоставление "готовой" программы обычно не подразумевает правки исходного кода.
Это не конечная версия программы. Так же править никто никого не заставляет. Можно пользоваться как есть... а можно и не пользоваться. Я считаю, что лучше сразу показать где и что можно подкорректировать под себя. Кому не нравится тот просто пройдёт мимо.

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И использование в качестве кабеля вместо полилинии с расширенными данными (например) блока с атрибутами очень спорное решение, имхо.
Решение не спорное, а на самом деле обдуманное. Оно позволяет мне контролировать линию от случайного копирования и прочих радостей жизни. Так же я сделал редактирование блоков (в том числе и пакетное). Так что не вижу в этом ничего плохого.
При том данная программа делалась под себя.. кому понравится, тому понравится. Я никого не заставляю
__________________
Если ты разговариваешь с идиотом - убедись что он не занят тем же!
petro_f вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.06.2017, 21:13
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 4,037


Цитата:
Сообщение от petro_f Посмотреть сообщение
Оно позволяет мне контролировать линию от случайного копирования и прочих радостей жизни
Чем защищает? Как полилинию могут случайно удалить, так и блок. Так же как и скопировать. Защищается от изменений, если блокировать слой, например. Так что это чисто вопрос реализации)
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 21.06.2017, 21:24
#9
petro_f


 
Регистрация: 06.10.2016
Сообщений: 55


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Чем защищает? Как полилинию могут случайно удалить, так и блок. Так же как и скопировать. Защищается от изменений, если блокировать слой, например. Так что это чисто вопрос реализации)
От удаления практически защититься не возможно (хотя конечно блок можно просто восстановить)... а вот от копирования - попробуйте скопировать блок, а затем нажать на иконку с треугольником.. Функция тут же пометит этот блок как неисправный. Так же попробуйте изменить имя кабеля в атрибуте..
А далее плагин эти кабели не учитывает в работе. Так что достаточно перед выгрузкой или маркировкой вызвать функцию проверки кабелей на соответсвие и они автоматом далее не будут участвовать в работе плагина. Так же это произойдёт, если кабель перенести в другой чертёж.
Так что какая никакая, но защита есть.
__________________
Если ты разговариваешь с идиотом - убедись что он не занят тем же!
petro_f вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.06.2017, 22:13
#10
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,552
Отправить сообщение для gomer с помощью ICQ Отправить сообщение для gomer с помощью Skype™


намаешься ты с этим трешем
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.06.2017, 22:21
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,908


Цитата:
Сообщение от petro_f Посмотреть сообщение
лезть в реестр по всякому поводу считаю глупой затеей
А тот факт, что в реестр лезет почти каждая программа, установленная на компе - это так, мелочь? Ну-ну...

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от petro_f Посмотреть сообщение
мне проще
Ключевое слово - "мне".
Ладно, оставлю критику - все равно времени на посмотреть у меня нет
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 21.06.2017, 22:24
#12
petro_f


 
Регистрация: 06.10.2016
Сообщений: 55


Цитата:
Сообщение от gomer Посмотреть сообщение
намаешься ты с этим трешем
Ну я просто поделился. Кому понравится возьмёт и попользуется. А кому не по душе такая реализация, тот не будет пользоваться. Остальные, кто просто решил поболтать без аргументов, пускай отправляются в пешее эротическое путешествие, его ещё никто не отменял

А так уже как бы 5 больших проектов сделали и всё как часы работает. Так что не надо пессимизма

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ключевое слово - "мне".
Художника обидеть может каждый
Каждый делает наверное всё же под себя. Так что тут любое решение приемлемо.

----- добавлено через ~4 мин. -----
Далее я не вижу смысла писать ответы не по теме.
Будут вопросы именно по реализации плагина - пишите.
Остальные сообщения я думаю есть смысл игнорировать.
__________________
Если ты разговариваешь с идиотом - убедись что он не занят тем же!
petro_f вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.06.2017, 23:40
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,908


  1. Разница:
    Код:
    [Выделить все]
     (if (< (pdkfkg-number-rounding-numbers g_pdkfkg_certain_length_cabel) 1)
                        1
                        (pdkfkg-number-rounding-numbers g_pdkfkg_certain_length_cabel)
                        )
    и
    Код:
    [Выделить все]
     (min 1 (pdkfkg-number-rounding-numbers g_pdkfkg_certain_length_cabel))
    В первом случае функция вызывается дважды, во втором - только один раз.
  2. Код:
    [Выделить все]
     (if (= (pdkfkg-alert-question-answer
             "Ошибка заложенных параметров"
             "Длина \"упаковки\" кабеля превышает длину самого кабеля!\nИсправить?"
             (+ 4 48 4096)
             ) ;_ end of pdkfkg-alert-question-answer
           6
           ) ;_ end of =
        ;| предупреждаем, что длина кабеля меньше чем длина "упаковки" и предлагаем исправить |;
      (progn ;| если да, то продолжаем цикл и вызываем окно заново |;
        (setq pdkfkg_temp_work_permit_while t)
        )     ; end progn
      (progn ;| если нет, то разрешаем продолжить функцию |; (setq pdkfkg_temp_work_permit_while nil)) ; end progn
      ) ;_ end of if
    и
    Код:
    [Выделить все]
     (setq pdkfkg_temp_work_permit_while
           (= (pdkfkg-alert-question-answer
                "Ошибка заложенных параметров"
                "Длина \"упаковки\" кабеля превышает длину самого кабеля!\nИсправить?"
                (+ 4 48 4096)
                ) ;_ end of pdkfkg-alert-question-answer
              6
              ) ;_ end of =
          ) ;_ end of setq
    Второй вариант более логичен, мне кажется.
  3. Код:
    [Выделить все]
     (+ (pdkfkg-number-rounding-numbers g_pdkfkg_in_lotok_cabel)
       (pdkfkg-number-rounding-numbers g_pdkfkg_in_gofra_cabel)
       (pdkfkg-number-rounding-numbers g_pdkfkg_in_metrukav_cabel)
       (pdkfkg-number-rounding-numbers g_pdkfkg_in_cabelkanal_cabel)
       (pdkfkg-number-rounding-numbers g_pdkfkg_in_pvx_cabel)
       (pdkfkg-number-rounding-numbers g_pdkfkg_in_truba_cabel)
       (pdkfkg-number-rounding-numbers g_pdkfkg_in_shtroba_cabel)
       ) ;_ end of +
    и
    Код:
    [Выделить все]
     (apply '+
           (mapcar (function pdkfkg-number-rounding-numbers)
                   (list g_pdkfkg_in_lotok_cabel g_pdkfkg_in_gofra_cabel g_pdkfkg_in_metrukav_cabel g_pdkfkg_in_cabelkanal_cabel g_pdkfkg_in_pvx_cabel g_pdkfkg_in_truba_cabel g_pdkfkg_in_shtroba_cabel) ;_ end of list
                   ) ;_ end of mapcar
           ) ;_ end of apply
    Опять же, не лень было писать?
  4. Вместо (nth ...) нередко можно использовать car, cadr, caddr etc.
  5. Вызов конструкции типа
    Код:
    [Выделить все]
     (if pdkfkg_temp_flag_name_ucs ;| если тут есть текст |;
    вернет t, если pdkfkg_temp_flag_name_ucs не nil. Тип данных именно здесь не контролируется.
  6. Кстати, а зачем столько глобальных переменных? Не проще ли было бы создать одну глобальную переменную (если без нее не обойтись), куда загонять все данные, формируя соответствующий список?
  7. В функции pdkfkg-create-block-of-cabel-in-layout меняется cmdecho, но в локальном *error* исходное значение не восстанавливается.
  8. Попытка вызова
    Код:
    [Выделить все]
     (vlax-put-property
                            (vlax-invoke-method pdkfkg_vla_id_dictionary_layer 'item pdkfkg_temp_count)
                            'freeze
                            :vlax-false
                            )
    для текущего слоя гарантированно вызовет ошибку. Свойство Freeze для текущего слоя не меняется.
  9. Вместо
    Код:
    [Выделить все]
     (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "LENGTH_CABEL"
                           (if (< (pdkfkg-number-rounding-numbers g_pdkfkg_certain_length_cabel) 1)
                             1
                             (pdkfkg-number-rounding-numbers g_pdkfkg_certain_length_cabel)
                             ) ;_ end of if
                           ) ; ìèíèìàëüíîå çíà÷åíèå 1 ìåòð             
                         (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "IN_LOTOK_CABEL"
                           (pdkfkg-number-rounding-numbers g_pdkfkg_in_lotok_cabel)
                           ) ;_ end of PDKFKG-block-set-one-attributes
                         (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "IN_GOFRA_CABEL"
                           (pdkfkg-number-rounding-numbers g_pdkfkg_in_gofra_cabel)
                           ) ;_ end of PDKFKG-block-set-one-attributes
                         (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "IN_METRUKAV_CABEL"
                           (pdkfkg-number-rounding-numbers g_pdkfkg_in_metrukav_cabel)
                           ) ;_ end of PDKFKG-block-set-one-attributes
                         (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "IN_CABELKANAL_CABEL"
                           (pdkfkg-number-rounding-numbers g_pdkfkg_in_cabelkanal_cabel)
                           ) ;_ end of PDKFKG-block-set-one-attributes
                         (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "IN_PVX_CABEL"
                           (pdkfkg-number-rounding-numbers g_pdkfkg_in_pvx_cabel)
                           ) ;_ end of PDKFKG-block-set-one-attributes
                         (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "IN_TRUBA_CABEL"
                           (pdkfkg-number-rounding-numbers g_pdkfkg_in_truba_cabel)
                           ) ;_ end of PDKFKG-block-set-one-attributes
                         (pdkfkg-block-set-one-attributes
                           pdkfkg_list_selected_block_for_update
                           "IN_SHTROBA_CABEL"
                           (pdkfkg-number-rounding-numbers g_pdkfkg_in_shtroba_cabel)
                           )
    можно запросто обойтись примерно таким:
    Код:
    [Выделить все]
     (pdkfkg-block-set-one-attributes
      pdkfkg_list_selected_block_for_update
      "LENGTH_CABEL"
      (min 1 (pdkfkg-number-rounding-numbers g_pdkfkg_certain_length_cabel))
      ) ;_ end of pdkfkg-block-set-one-attributes
    (foreach item (list (cons "IN_LOTOK_CABEL" g_pdkfkg_in_lotok_cabel)
                        (cons "IN_METRUKAV_CABEL" g_pdkfkg_in_metrukav_cabel)
                        (cons "IN_CABELKANAL_CABEL" g_pdkfkg_in_cabelkanal_cabel)
                        (cons "IN_PVX_CABEL" g_pdkfkg_in_pvx_cabel)
                        (cons "IN_TRUBA_CABEL" g_pdkfkg_in_truba_cabel)
                        (cons "IN_SHTROBA_CABEL" g_pdkfkg_in_shtroba_cabel)
                        ) ;_ end of list
      (pdkfkg-block-set-one-attributes
        pdkfkg_list_selected_block_for_update
        (car item)
        (pdkfkg-number-rounding-numbers (cdr item))
        ) ;_ end of pdkfkg-block-set-one-attributes
      )
    Или вообще таким:
    Код:
    [Выделить все]
     (foreach item (list (list "LENGTH_CABEL" 1 g_pdkfkg_certain_length_cabel)
                        (cons "IN_LOTOK_CABEL" g_pdkfkg_in_lotok_cabel)
                        (cons "IN_METRUKAV_CABEL" g_pdkfkg_in_metrukav_cabel)
                        (cons "IN_CABELKANAL_CABEL" g_pdkfkg_in_cabelkanal_cabel)
                        (cons "IN_PVX_CABEL" g_pdkfkg_in_pvx_cabel)
                        (cons "IN_TRUBA_CABEL" g_pdkfkg_in_truba_cabel)
                        (cons "IN_SHTROBA_CABEL" g_pdkfkg_in_shtroba_cabel)
                        ) ;_ end of list
      (pdkfkg-block-set-one-attributes
        pdkfkg_list_selected_block_for_update
        (car item)
        (if (not (listp (cdr item)))
          (pdkfkg-number-rounding-numbers (cdr item))
          (min (cadr item) (pdkfkg-number-rounding-numbers (caddr item)))
          ) ;_ end of if
        ) ;_ end of pdkfkg-block-set-one-attributes
      ) ;_ end of foreach
Ну и так далее. В код изменения не вносил, работоспособность не проверял.


----- добавлено через ~7 мин. -----
И заменить монстра
Код:
[Выделить все]
 (or ;| если полученный элемент является чем либо из перечисленных, тогда |;
  (wcmatch (cdr
             (assoc 0
                    (entget
                      (handent (vlax-get-property
                                 (vlax-invoke-method pdkfkg_temp_vla_name_description_block 'item pdkfkg_temp_two_count)
                                 'handle
                                 ) ;_ end of vlax-get-property
                               ) ;_ end of handent
                      ) ;_ end of entget
                    ) ;_ end of assoc
             ) ;_ end of cdr
           "*POLYLINE"
           ) ;_ end of wcmatch
  (wcmatch (cdr
             (assoc 0
                    (entget
                      (handent (vlax-get-property
                                 (vlax-invoke-method pdkfkg_temp_vla_name_description_block 'item pdkfkg_temp_two_count)
                                 'handle
                                 ) ;_ end of vlax-get-property
                               ) ;_ end of handent
                      ) ;_ end of entget
                    ) ;_ end of assoc
             ) ;_ end of cdr
           "LINE"
           ) ;_ end of wcmatch
  (wcmatch (cdr
             (assoc 0
                    (entget
                      (handent (vlax-get-property
                                 (vlax-invoke-method pdkfkg_temp_vla_name_description_block 'item pdkfkg_temp_two_count)
                                 'handle
                                 ) ;_ end of vlax-get-property
                               ) ;_ end of handent
                      ) ;_ end of entget
                    ) ;_ end of assoc
             ) ;_ end of cdr
           "ARC"
           ) ;_ end of wcmatch
  (wcmatch (cdr
             (assoc 0
                    (entget
                      (handent (vlax-get-property
                                 (vlax-invoke-method pdkfkg_temp_vla_name_description_block 'item pdkfkg_temp_two_count)
                                 'handle
                                 ) ;_ end of vlax-get-property
                               ) ;_ end of handent
                      ) ;_ end of entget
                    ) ;_ end of assoc
             ) ;_ end of cdr
           "ELLIPSE"
           ) ;_ end of wcmatch
  (wcmatch (cdr
             (assoc 0
                    (entget
                      (handent (vlax-get-property
                                 (vlax-invoke-method pdkfkg_temp_vla_name_description_block 'item pdkfkg_temp_two_count)
                                 'handle
                                 ) ;_ end of vlax-get-property
                               ) ;_ end of handent
                      ) ;_ end of entget
                    ) ;_ end of assoc
             ) ;_ end of cdr
           "SPLINE"
           ) ;_ end of wcmatch
  )
на вменяемые
Код:
[Выделить все]
 (or ;| если полученный элемент является чем либо из перечисленных, тогда |;
  (wcmatch (cdr
             (assoc 0
                    (entget
                      (handent (vlax-get-property
                                 (vlax-invoke-method pdkfkg_temp_vla_name_description_block 'item pdkfkg_temp_two_count)
                                 'handle
                                 ) ;_ end of vlax-get-property
                               ) ;_ end of handent
                      ) ;_ end of entget
                    ) ;_ end of assoc
             ) ;_ end of cdr
           "*POLYLINE,LINE,ARC,ELLIPSE,SPLINE"
           ) ;_ end of wcmatch
  ) ;_ end of or


----- добавлено через ~11 мин. -----
Ох, елки! Там код упрощать можно оооочень долго...
Уже под more прятать не буду
Код:
[Выделить все]
 (assoc "NAME_CABEL" pdkfkg_temp_all_data_attrib_one_block) ;| проверяем наличие всех атрибутов|;
                 (assoc "IN_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "OUT_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "TYPE_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "MOD_OF_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "LENGTH_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "NOTE_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "IN_LOTOK_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "IN_GOFRA_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "IN_METRUKAV_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "IN_CABELKANAL_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "IN_PVX_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "IN_TRUBA_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "IN_SHTROBA_CABEL" pdkfkg_temp_all_data_attrib_one_block)
                 (assoc "ADD_LENGTH_CABEL" pdkfkg_temp_all_data_attrib_one_block)
vs
Код:
[Выделить все]
 (apply 'and
       (mapcar (function (lambda (x) (cdr (assoc x pdkfkg_temp_all_data_attrib_one_block))))
               '("NAME_CABEL"           "IN_CABEL"             "OUT_CABEL"            "TYPE_CABEL"           "MOD_OF_CABEL"         "LENGTH_CABEL"         "NOTE_CABEL"
                 "IN_LOTOK_CABEL"       "IN_GOFRA_CABEL"       "IN_METRUKAV_CABEL"    "IN_CABELKANAL_CABEL"  "IN_PVX_CABEL"         "IN_TRUBA_CABEL"       "IN_SHTROBA_CABEL"
                 "ADD_LENGTH_CABEL"
                 )
               ) ;_ end of mapcar
       ) ;_ end of apply
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 21.06.2017 в 23:52.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 22.06.2017, 01:48
#14
petro_f


 
Регистрация: 06.10.2016
Сообщений: 55


Ну докопаться и до столба можно, но:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По качеству кода
1. При единичном вызове функции не имеет никакой разницы...
2. Абсолютно нет, так как это немного логически разные операции с флагом. Сказать, что там всё не так и при этом не вдаваться в логику запроса, легко. Но не всегда очевидные пути логичны.
3. Невероятно, но не лень. По скорости обработки разница никакая, а по удобству при редактировании - колоссальна.
4. Откровенный бред. Не всегда nth можно заменить на caadr и им подобные. Такое мог бы написать школьник, но не Вы... nth возвращает единичное значение всегда. car..cadr и им подобные могут вернуть остаток списка, вместо единичного значения... т.е. мне всегда надо точно знать, что будет возвращено и иметь шанс хапнуть на вход не 1 параметр, а несколько. Зачем??? Цена вопроса применения (по скорости обработки) абсолютно одинакова. Так что это просто из серии доебаться лишь бы что то написать.
5. В процессе написания плагина логика поменялась, так что там контролируется наличие или отсутствие данных, а не их тип... Переделывать функцию не стал, а просто оставил такой.
6. Ну ту дело вкуса... Можно вообще битами флаги выставлять в реестре, ну если у тебя например микроконтроллер, а можно и осмысленные имена давать переменным и завести их ровно столько, сколько тебе требуется. Как бы одна переменная или 50 нет разницы, а вот шанс вписать в сводную переменную лишнюю инфу и порушить работу плагина - увеличится. Так что это так себе замечание.
7. Опять же замечание из серии я не разобрался и лишь бы что то написать. Просто опишу - момент работы (написания) плагина растянулся на несколько месяцев. В процессе работы некоторые функции переписывались, у некоторых расширялись возможности. Так уж получилось, что функция (PDKFKG-remember-layer) и функция ( PDKFKG-back-remembers-layer) а так же (PDKFKG-all-restore-settings) стали запоминать и восстанавливать более расширенный комплект переменных, включая и cmdecho. Позже, что бы не проверять и переписывать каждую функцию я просто оставил как есть. Так что данная переменная восстанавливается, а с ней и куча других. Код конечно же можно вылизать до идеала, но принцип работает - не лезь править, никто не отменял..
8. Ответ как и в пункте выше, про не разобравшись в логике работы. Имя текущего слоя в данный список не попадает...
9. Можно, но в определённый момент времени (я всё же не проф программист LISP) мне не нравилось направо и налево применять этот функционал (mapcar, foreach...). Сейчас бы я переписал это так, но с другой стороны это работает и читаемо, так что не вижу смысла переписывать.


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Настоятельно советую изучить справку по wcmatch
Можно конечно переделать и так. И даже выиграть 18 наносекунд в скорости выполнения операции Но стоит ли оно того? Так мне на тот момент было удобней написать именно так.
Будет время - оптимизирую этот жутчайший косяк из за которого мне лучше пойти и удавиться, так как я точно не программист а полное г...о момент...

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ох, елки! Там код упрощать можно оооочень долго...
Уже под more прятать не буду
Ну тут часть ответа под номером 9 и предыдущий коммент так же подойдёт...
Но по мне мой вариант читается намного внятней при отладке кода, чем предложенный вариант с "apply 'and mapcar"... Я всегда выступаю за то, что если читабельность кода глазами вызовет написание лишних 10-х строк - значит надо написать эти строки. Компу (компилятору) глубоко похфиг, а мне для отладки легче и удобней.
Так что последних несколько замечаний - это просто обычная вкусовщина..

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

Последний раз редактировалось petro_f, 22.06.2017 в 01:56.
petro_f вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2017, 06:24
| 1 #15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,908


petro_f, ок, ок, уговорил. Я дурень, влез куда не просили Умолкаю.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2017, 07:25
| 1 #16
Erbol2014

ТОО
 
Регистрация: 22.05.2014
Аршалы
Сообщений: 50


Цитата:
Сообщение от petro_f Посмотреть сообщение
Уважаемый где и что Вы там нашли? Всё что у меня загружено это взято тут, SelSim и GeomProps.
При открытии вашего файла Автокад выдаёт - см. картинку
У меня никогда такого не выдавало.
Вы в файле чего то мудрили с макросами, удалили, а следы остались.
Чтобы такого небыло создавайте новый файл и копируйте в него содержимое.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 66
Размер:	99.5 Кб
ID:	190033  
Erbol2014 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2017, 09:07
#17
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 1,461


Подтверждаю, в dwg файле имеется внедренный vba проект. Пустой.
Для удаления этого мусора:
Команда _vbaman нажать отмеченную кнопочку


А вообще в самом файле очень много мусора и прокси объектов, его бы почистить...

Хотя, я уже знаю что ответит автор... =о)

Последний раз редактировалось Boxa, 22.06.2017 в 09:12.
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 22.06.2017, 09:22
#18
petro_f


 
Регистрация: 06.10.2016
Сообщений: 55


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
petro_f, ок, ок, уговорил. Я дурень, влез куда не просили Умолкаю.
Алексей, ну не надо так демонстративно. Просто я ожидал бы замечания по делу. Согласен, что wcmatch просто затупил, а остальное по большому счёту не принципиально... каждый пишет так как ему удобно. И даже в таком варианте wcmatch работает.
Давайте без обид общаться. Ок?
Я всегда готов к конструктивному диалогу. Если где высказался резко, то это не со зла



Цитата:
Сообщение от Erbol2014 Посмотреть сообщение
При открытии вашего файла Автокад выдаёт - см. картинку
У меня никогда такого не выдавало.
Вы в файле чего то мудрили с макросами, удалили, а следы остались.
Чтобы такого небыло создавайте новый файл и копируйте в него содержимое.
Erbol2014 я этот файл просто приложил в последний момент. Если Вас прямо прёт, то можете смело нажать "не включать макросы".
P.S. Посмотрел я на то, что Вас там с макросами пугало ))) Видимо от АР наследие с пустым проектом VBA из подложки прилетело. Сейчас почищу и заменю файл. Так что можете его перекачать заново.

----- добавлено через ~34 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
Подтверждаю, в dwg файле имеется внедренный vba проект. Пустой.
Для удаления этого мусора:
Команда и картинка

А вообще в самом файле очень много мусора и прокси объектов, его бы почистить...

Хотя, я уже знаю что ответит автор... =о)
Воха Вы не поверите, но пока я писал ответ, и чистил файл :0 Вы успели свой ответ написать.
Выгрузил, от прокси объектов не стал чистить, так как это объекты СПДС и при весе в 900 кб файла, перерывать всю АР я не вижу смысла.
Данный файл был просто прилеплен для демонстрации, Так как с него писались гифки. Никто и никогда в нём работать то не будет. Смысл его чистить? Или Вас смущают стандартные СПДС объекты?
__________________
Если ты разговариваешь с идиотом - убедись что он не занят тем же!

Последний раз редактировалось petro_f, 22.06.2017 в 09:32.
petro_f вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2017, 10:12
#19
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,908


petro_f, без вникания - что такое кабельные линии, что такое разделы КИПиА, без понимания (хотя бы примерного) специфики работы, я так полагаю, электриков - по функционалу лично я сказать ничего не могу. По коду - да, но это максимум.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2017, 11:54
#20
AlexZh


 
Регистрация: 23.09.2015
Сообщений: 131


petro_f. Молодец! Хорошая программа. Видно человек старался! Кому надо, тот возьмет на вооружение.

Кулик Алексей aka kpblc, хорошие замечания по коду.

Некоторые остальные, да. Много необоснованной критики. Человек поделился своим творением. Заметьте, бесплатно. Не каждый на такое способен.

Я вот думаю, все эти свойства все-таки через расширенные данные пользовать. По моему, если кабелей будет много, как то не удобно будет пользоваться чертежом с большим количеством блоков. или уж в грубы объединять.
__________________
Проекты СС
AlexZh вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP. Плагин создания кабельных линий и генерации КЖ раздела КИПиА. Протестировано на AutoCAD 2015...2018 и офис 2013...2016

 VetCAD++
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адаптация древних lisp-приложений под AutoCad 2016 trushev LISP 36 08.02.2016 10:33
Autocad 2016 не понимает последовательность команд с ^C^C... Santa123 AutoCAD 0 27.01.2016 10:31
Проблема открытия файлов в Autocad 2010 после установки Autocad 2015 Volodya AutoCAD 18 30.10.2014 14:30

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||