| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Создание листа и вписывание в него объекта на LISP

Создание листа и вписывание в него объекта на LISP

Ответ
Поиск в этой теме
Непрочитано 08.04.2021, 17:09 #1
Создание листа и вписывание в него объекта на LISP
[igrik]
 
Инженер-конструктор
 
Крым
Регистрация: 04.06.2014
Сообщений: 15

Добрый день всем.
Хочу написать маленький LISP, который будет автоматически создавать 1 лист и вписывать выбранный объект/блок в этот лист.
Но сам в этом пока что ничего не понимаю. Подтолкните с чего правильнее начать, потому что в самом начале знакомства с LISP не хочется перелопатить тонну литературы. Хорошо знаю C++ и JS

Пошаговый алгоритм я придумал:
1) Жмём, например, F12;
2) Автокад просит нас указать любой объект, пользователь выбирает нужный объект;
3) Программа выводит запрос аля "^C^C^RРЛИСТ Ш Шаблоны.dwt" (в файле шаблоны уже созданы листы всех необходимых форматов с установленным в них видовым экраном по границам листов), и пользователь выбирает необходимый формат из предложенного списка форматов; (мы точно уверены, что у нас гарантированно есть 1 и только 1 видовой экран на листе)
4) После данного выбора формата (пусть будет А3), программа:
5.1) создаёт лист А3 из шаблона и переименовывает его в "л.(номер следующего листа)", например л.(1);
6.2) точно по границам видового экрана вписывает этот объект в созданный лист;
6.2*) при необходимости: из пространства листа программа возвращает нас в модель;
6.3) действие программы закончено: передать пользователю управление и выход из программы;

Файл шаблона прилагаю (https://disk.yandex.ru/d/-1yLcgBEtHsqiw)
Программа должна работать в AutoCAD 2011 и 2016

Хотелось бы помощи в виде:
1) это можно сделать с помщью команды name
2) это можно сделать с помщью команды name
3) тут нужно сохранить параметры объекта (например в массив) и с помощью команды name выполнить что-то
и т.д.

UPD 15.04.2021
Код:
[Выделить все]
 ; БЫСТРОЕ РУЧНОЕ СОЗДАНИЕ ЛИСТА (ИЗ ШАБЛОНА)

; автор: [igrik]
; дата: 14.04.2021
; лицензия: GPL (Свободное ПО)

; требования: для работы скрипта необходим файл "Шаблоны.dwt" по пути
; C:\Users\<имя_пользователя>\AppData\Local\Autodesk\AutoCAD <год>\<версия>\rus\Template

; функционал:
; - при вызове функции "QuickCreateNewLayout" пользователь должен
;    1) указать в пространстве модели 2 крайние (по диагонали) точки абстрактного прямоугольника,
;   	который в дальнейшем будет вписан в создаваемый лист;
;    2) выбрать формат создаваемого листа;

; - после этого скрипт:
;   - создаст лист с видовым экраном по шаблону;
;   - впишет в него выбранное пространство
;   - и переименует новый лист в следующее число (а-ля "1", "2", "3" и т.д.)


(defun c:QuickCreateNewLayout ( / layoutName tabMax p1 p2 lastViewport )
    
    ; Turn OFF command line echoing
    (setvar "cmdecho" 0) 

	; Отключаем пространство листа и делаем текущим пространство модели
	(setvar "tilemode" 1) 

	; получаем от пользователя 2 вершины области
	(setq p1 (getpoint "\nУкажите одну из вершин области: "))  
	(setq p2 (getcorner p1 "\nУкажите противоположную вершину области: "))

    ; необходим для вызова старой версии команды "_layout"
    (InitCommandVersion 2) 
    ; создание листа по шаблону
    (command "_layout" "_t" "Шаблоны.dwt" ) 

    ; инициализация переменных
    (setq layoutName "igrik") 
    (setq tabMax 0)

    ; Загрузка функций ActiveX
    (vl-load-com) 

    ; получаем список листов
    (vlax-for lyt 
        (vla-get-layouts
            (vla-get-activedocument (vlax-get-acad-object)) 
        )  
        ; исключаем из цикла "Модель"
        (if (not (eq "MODEL" (strcase (vla-get-name lyt))))
            (progn 
                ; по номеру закладки листа ищем id последнего листа
                (if (< tabMax (vla-get-TabOrder lyt) )
                    (progn            
                        (setq tabMax (vla-get-TabOrder lyt))
                        (setq layoutName (vla-get-name lyt))
                    )
                )
            )
        )
    )

    ; переименовываем полдений лист в "цифру"
    (command "_layout" "_r" layoutName (itoa tabMax))
    (setq layoutName (itoa tabMax))

    ; Проверяем название листа (если Модель, то выход)
    (if (/= layoutName "Model") 
        (progn
            ; переходим в новосозданный лист
            (setvar "ctab" layoutName)

            ; запомнить название видового экрана (для блокировки оного)
            ; (setq lastViewport (ssget "_L")) 

            ; Открыть видовой экран
            (command "_mspace") 
            ; вписываем выбранную область по точкам (через функцию зуммирования)
            (command "_zoom" "_w" p1 p2) 

            ; Блокировка видового экрана
            ; (command "_vports" "_LOCK" "_ON" lastViewport "") 

            ; Закрыть окно видового экрана
            (command "_pspace") 

            ; Делаем лист на весь экран
            (command "_zoom" "_e") 

            ; Переходим на вкладку Модель
            (setvar "ctab" "Model") 
        )
        ; с случае ошибки: информируем пользователя
        (alert "\nЭта команда может быть запущена только на вкладке ЛИСТ!") ; 
    ) 
    ; Turn ON command line echoing
    (setvar "cmdecho" 1) 
)

; end script
Видео-инструкция:
https://youtu.be/K0F9IdW9ulQ

Вложения
Тип файла: lsp QuickCreateNewLayout.lsp (3.3 Кб, 66 просмотров)


Последний раз редактировалось [igrik], 28.04.2021 в 22:19. Причина: Добавлена видео инструкция
Просмотров: 7719
 
Непрочитано 08.04.2021, 17:28
#2
Boxa

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


Если хорошо знаете плюсы, почему не хотите писть на плюсах?
Boxa вне форума  
 
Автор темы   Непрочитано 08.04.2021, 17:58
#3
[igrik]

Инженер-конструктор
 
Регистрация: 04.06.2014
Крым
Сообщений: 15


Потому что внутреннюю кухню автокада я не знаю, и то каким образом связать автокад и плюсы.
Да и как мне кажется поставленная задача в лиспе займет строк 30-50. Смысл это делать на плюсах? хотя может я чего и не знаю.
[igrik] вне форума  
 
Непрочитано 08.04.2021, 18:01
#4
Петр-и-Алекс


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


"Хорошо знаю C++ и JS" - эти знания, а главное - привычки, скорее помешают
не рекомендую лезть в лисп без совсем совсем серьезных причин или личного интереса.
не то что б "шибко сложно", но шибко уж по инопланетянски.
Петр-и-Алекс вне форума  
 
Непрочитано 08.04.2021, 19:00
#5
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,492


На лиспе кода нет. На с++ нашел древнюю какую-то процедуру.

Код:
[Выделить все]
 void setVpTwist(ads_point targetmodel,ads_point targetspace,double widthspace,double heightspace,double heightmodel)
{
      //Create a new AcDViewPort


	  AcDbViewport *pVPort = new AcDbViewport();
 
      pVPort->setCenterPoint(AcGePoint3d(targetspace[0],targetspace[1],0));//Точка в папирспэйсе
      pVPort->setHeight(heightspace);//Высота в папирспэйсе
      pVPort->setWidth(widthspace);//Ширина в папирспэйсе
 
      pVPort->setViewHeight(heightmodel);//Высота в модельспэйсе
      pVPort->setViewTarget(AcGePoint3d(targetmodel[0],targetmodel[1],0));
 
      pVPort->setViewDirection(AcGeVector3d(0,0,1));
 
      //ViewCenter is in DCS of the Model Space, Target point is the origin for the DCS
      pVPort->setViewCenter(AcGePoint2d(0,0));
 
      //View twist is along Z of DCS and origin at view target
      pVPort->setTwistAngle(0.0);



		AcDbBlockTable *pBlockTable;
		acdbHostApplicationServices()->workingDatabase()
		->getSymbolTable(pBlockTable, AcDb::kForRead);

		AcDbBlockTableRecord *pBlockTableRecord;
		pBlockTable->getAt(ACDB_PAPER_SPACE, pBlockTableRecord,
		AcDb::kForWrite);
		pBlockTable->close();

		AcDbObjectId lineId;
		pBlockTableRecord->appendAcDbEntity(lineId, pVPort);

		pBlockTableRecord->close();
		pVPort->setOn();
		pVPort->close();

}
Может сгодиться кому.
Я для себя решил, что в пространстве листа лучше не работать.
nickname2019 вне форума  
 
Непрочитано 08.04.2021, 19:09
1 | #6
Сергей812


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


Цитата:
Сообщение от [igrik
]Да и как мне кажется поставленная задача в лиспе займет строк 30-50. Смысл это делать на плюсах? хотя может я чего и не знаю.
1. Ну на этом хотелки не остановятся)
2. Ну тут либо изучать внутреннюю программную модель акада на хорошо знакомом C++, либо изучать внутреннюю программную модель акада плюс весьма своеобразный списочный лисп)

для затравки - собственно, это официальный сайт поддержки разработчиков на русском)
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.04.2021, 19:22
#7
[igrik]

Инженер-конструктор
 
Регистрация: 04.06.2014
Крым
Сообщений: 15


nickname2019, спасибо, но это именно то о чём я и говорил про С++ в связке с Автокадом: где искать описание классов, таких как AcDViewPort и их методов, как мне узнать названия функций для выбора объектов, создания листа, переключения в этот лист, переименования листа и т.п. С++ в данном случае у меня вызвает массу вопросов: в чём писать код? В студии? Какой формат выходного файла должен быть? ARX или dll, или ещё что-то. Если это ARX, то я знаю как его подключить. Если dll, то я хз как подключать его к автокаду (думаю не сложно, но я в данном направлении даже не копал). Вообще C++ был упомянут, чтобы указать что я понимаю что такое программирование и только. А писать на нём плагин с таким "простым" функционалом - по моему - овчинка выделки не стоит.

Мне всего-то нужно сделать: получить объект в модели, найти в нём координаты верхней-правой и нижней-левой точек и запомнить их. Создать лист и переключиться в него. Потом переключиться в видовой экран и вызвать зум->рамка, в которую передать в 2 точки. Закрыть видовой экран и вернуться в модель.
Ладно, пойду копать книги по AutoLISPу.
[igrik] вне форума  
 
Непрочитано 08.04.2021, 19:34
#8
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,492


Цитата:
Сообщение от [igrik] Посмотреть сообщение
nickname2019, спасибо, но это именно то о чём я и говорил про С++ в связке с Автокадом: где искать описание классов, таких как AcDViewPort и их методов, как мне узнать названия функций для выбора объектов, создания листа, переключения в этот лист, переименования листа и т.п. С++ в данном случае у меня вызвает массу вопросов: в чём писать код? В студии? Какой формат выходного файла должен быть? ARX или dll, или ещё что-то. Если это ARX, то я знаю как его подключить. Если dll, то я хз как подключать его к автокаду (думаю не сложно, но я в данном направлении даже не копал). Вообще C++ был упомянут, чтобы указать что я понимаю что такое программирование и только. А писать на нём плагин с таким "простым" функционалом - по моему - овчинка выделки не стоит.

Мне всего-то нужно сделать: получить объект в модели, найти в нём координаты верхней-правой и нижней-левой точек и запомнить их. Создать лист и переключиться в него. Потом переключиться в видовой экран и вызвать зум->рамка, в которую передать в 2 точки. Закрыть видовой экран и вернуться в модель.
Ладно, пойду копать книги по AutoLISPу.
https://forum.dwg.ru/showthread.php?t=124456

Имхо, Вам проще разобраться с с++

https://forum.dwg.ru/showthread.php?t=158219

У лиспа есть ограничения (и тормоза), на нем не всё можно сделать.

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

Последний раз редактировалось nickname2019, 08.04.2021 в 19:41.
nickname2019 вне форума  
 
Непрочитано 08.04.2021, 19:47
#9
Сергей812


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


Цитата:
Сообщение от [igrik
;1933209]Если это ARX, то я знаю как его подключить. Если dll, то я хз как подключать его к автокаду (думаю не сложно, но я в данном направлении даже не копал)
ну если надстройка в виде dll - это скорее всего Net сборка, поэтому команда _netload акада.
Сергей812 вне форума  
 
Непрочитано 08.04.2021, 21:44
#10
Boxa

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


На плюсах же можно писать managed .NET dll... а значит строгих ограничений на версию студии и компиляцию под версии можно не касаться...
Да и порог вхождения .NET API у автокада несколько ниже, чем ARX, а примеров кода в инете больше.

В любом случае удачи Вам.

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Я для себя решил, что в пространстве листа лучше не работать.
Почему? Чем это принципиально отличается от работы в любом другом блоке, в том числе и в модели?
Boxa вне форума  
 
Непрочитано 09.04.2021, 06:42
#11
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


С одной стороны, на лиспе все давно написано рядом.
С другой стороны, какая разница на чем писать. если есть навыки писать на С++ почему бы и нет?
Цитата:
Сообщение от igrik
где искать описание классов, таких как AcDViewPort и их методов, как мне узнать названия функций для выбора объектов, создания листа, переключения в этот лист, переименования листа и т.п.
Все это можно найти в справке автодеска. И соглашусь с Сергей812, какая разница в какой среде изучать модель акада? Изучать все равно надо будет.
можно в кад стучатся через lisp (vla-get-Utility (vla-get-activeDocument (vlax-get-acad-object)))
а можно и через .net Autodesk.AutoCAD.ApplicationServices.DocumentManager.MdiActiveDocument.Editor

ИМХО. Лисп интересен инженеру-НЕпрограммисту низким порогом входа и возможностью написать костыль на бегу.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 09.04.2021, 10:16
| 1 #12
[igrik]

Инженер-конструктор
 
Регистрация: 04.06.2014
Крым
Сообщений: 15


Спасибо за подсказки.
Для себя решил, что в качестве обучения и для предметного понимания разницы, попробую решить эту задачу двумя способами: на Lisp'е и на С++.
О результате обязательно отпишусь в этой теме.

Всем лёгкой пятницы.
[igrik] вне форума  
 
Непрочитано 09.04.2021, 10:41
#13
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от igrik
попробую решить эту задачу двумя способами
Опять же ИМХО, можно заработать когнитивный диссонанс. Меня в частности, после лисповских решений долго мучал вопрос получения указателя на активное пространство. В lisp это надо решать весьма изощренно. В .net подход кардинально другой (проще) и это ломает шаблоны (особенно когда хочешь нагуглить знакомый механизм на другом языке, а его в природе нет, потому что все это реализовано иначе).
Что то мне подсказывает, что имея под рукой студию и опыт работы с ней, разобраться в структуре када будет даже проще, чем копать лисп. И еще один неоспоримый факт: лисп реализует доступ не ко всей модели када. Второй факт (где можно поспорить): лисп реализует доступ к модели када через задний проход весьма изощренными способами.
Ну и на закуску, тут Алексей недавно тесты проводил, где одна и та же задача на .net реализуется в 600 раз быстрей чем на VisualLisp.

з.ы. я бы ставил вопрос не Lisp против C++, а C# против Pyton против C++. Тут суть одна, что это .net. обычно C++ используют для серьезных программ под кад, когда надо создавать свои новые объекты со своим поведением.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 09.04.2021, 10:48
#14
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,492


Цитата:
Сообщение от Boxa Посмотреть сообщение
Почему? Чем это принципиально отличается от работы в любом другом блоке, в том числе и в модели?
Я открыл для себя возможности создания чертежей изделий как набора (списка) динамических (псевдодинамических) блоков в пространстве модели, т.е. объект на плане (схеме расположения) может сам на себя сгенерировать деталировочный чертеж с размерами, с марикровками, со спецификацией и со штампом в пространстве модели в нужном масштабе.
Т.е. не нужно настраивать виды из листа, туда-сюда мышкой тыкать, масштаб аннотаций выбирать, ждать регенерации и т.д.
Но я занимаюсь чертежами КР, КЖ, КМ, тут своя специфика.
nickname2019 вне форума  
 
Непрочитано 09.04.2021, 11:01
#15
Boxa

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


nickname2019, понятно, это не про программирование и не про возможные подводные камни связанные с работой с листом, это про организацию своего труда.
Тогда вопросов нет, кому как удобнее, тот так и работает.
Boxa вне форума  
 
Автор темы   Непрочитано 09.04.2021, 21:58
| 1 #16
[igrik]

Инженер-конструктор
 
Регистрация: 04.06.2014
Крым
Сообщений: 15


Вот и начались танцы с бубном, которых я опасался при использовании С++. Плохо. Очень плохо((

/*
* Версия SDK: 2016
* http://download.autodesk.com/esd/obj...and_32_Bit.exe
* Совместимость с версиями AutoCAD: 2016
* Версии Microsoft Visual Studio: 2012

* Версия SDK: 2011
* http://download.autodesk.com/esd/obj...and_32_Bit.exe
* Совместимость с версиями AutoCAD: 2011, 2012
* Версии Microsoft Visual Studio: 2008 SP1
*/

Так как я указывал, что "Программа должна работать в AutoCAD 2011 и 2016", помимо версий SDK 2011 и 2016, мне ещё нужно скачать и установить VS 2012 и VS 2008.
А "Visual Studio 2019 можно использовать только для создания arx-приложений для AutoCAD 2021" @ Александр Ривилис

Итог: лучше уж написать костыль на лиспе (который будет работать и на 2011 и на 2016 версии автокада), чем я буду ставить 2 студии, а потом выискивать причины проблем линковки разных версий.
[igrik] вне форума  
 
Непрочитано 11.04.2021, 11:57
#17
Сергей812


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


либо использовать .Net C# - с плюсов перейти на него будет легче, имхо - чем на лисп
Сергей812 вне форума  
 
Непрочитано 11.04.2021, 16:04
#18
Boxa

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


[igrik], а зачем Вы стали писать arx?!?! Ранее писал, что на C++ можно писать managed .NET dll и не вляпываться в проблемы с версиями, зачем усложнять себе жизнь, а потом героически преодолевать эти сложности?
https://docs.microsoft.com/ru-ru/cpp...?view=msvc-160
Boxa вне форума  
 
Автор темы   Непрочитано 12.04.2021, 08:41
#19
[igrik]

Инженер-конструктор
 
Регистрация: 04.06.2014
Крым
Сообщений: 15


Цитата:
Сообщение от Boxa Посмотреть сообщение
[igrik], а зачем Вы стали писать arx?!?! Ранее писал, что на C++ можно писать managed .NET dll и не вляпываться в проблемы с версиями, зачем усложнять себе жизнь, а потом героически преодолевать эти сложности?
https://docs.microsoft.com/ru-ru/cpp...?view=msvc-160
Значит я вас не правильно понял. Спасибо за уточнение.
[igrik] вне форума  
 
Автор темы   Непрочитано 14.04.2021, 17:17
#20
[igrik]

Инженер-конструктор
 
Регистрация: 04.06.2014
Крым
Сообщений: 15


Так, на лиспе готово (смотреть первый пост).
Тонну сайтов пришлось перелопатить...
Но я так и не нашёл я нормально-сформированной справки по vla-*

Теперь буду пробовать запилить через .NET dll

UPD 21/05/2022: Сделано на .NET dll. Подробнее тут

Последний раз редактировалось [igrik], 21.05.2022 в 13:12. Причина: Реализация на .NET dll
[igrik] вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Создание листа и вписывание в него объекта на LISP

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Создание таблицы координат. 741520 LISP 2 30.03.2016 09:22
Создание Lisp для расчета глубины траншеи Тимур С. LISP 17 24.03.2016 20:57
Как создать объект SPDS Extension из visual lisp? Владас LISP 5 26.05.2015 15:12
Lisp. Создание слоя(слоёв) из мастер-списка. Изменения в программу CLAY от JefferyPSanders 99xt1 LISP 24 01.12.2014 12:24
Lisp - ошибка определения длины объекта Лиспер LISP 8 30.11.2010 00:37