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

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

Как вставить один прямоугольник через лисп?

Ответ
Поиск в этой теме
Непрочитано 22.12.2022, 12:17 #1
Как вставить один прямоугольник через лисп?
Jek30
 
Регистрация: 19.08.2022
Сообщений: 71

Может кто-нибудь сможет написать лисп для вставки прямоугольника (хотябы черновой вариан)!
На форумах искал подобное, но там всё не то.
В общем если кому-нибудь будет интересно, то суть будущего лиспа в следующем:
(Например есть трасса кабельной линии, а на пересечениях этой трассы с коммуникациями нужно прокладывать кабель в трубах, а пересечений всегда много). Так вот. На плане это выглядит так:
В виде кабеля имеется полилиния с множеством углов поворотов в различном направлении, а в некоторых местах на эту линию нужно вставить прямоугольнички разных длин (т.е. трубы через коммуникации) и естественно симметрично и параллельно данной поллилинии.
Нужно чтоб нажал кнопку лиспа и вышло бы например указание "Укажите точку вставки прямоугольника (трубы)"
После указания точки вставки указывается вторая точка, которая определяет длину (в данном случае половину длины) прямоугольника и его направление (по длинной стороне).
После указания этих двух точек (симметрично той поллилинии, на которой мы выбрали точку вставки), от первой указанной точки (точки вставки) у нас должен отрисоваться от собственного центра, один прямоугольник, в обе стороны от первой указанной точки, а длиной (т.е. половиной) и направлением по второй указанной точке.
Цвет прямоугольника-синий. Ширина - 0,4 мм (а длину и направление указываем второй точкой). Тип линии-пунктир . Толщина - 0,35 мм.
Данный Лисп думаю многим бы пригадился, тем кто прокладывает на "бумаге" различные сети. К тому же я думаю что ширину прямоугольника, толщину, тип и цвет линии каждый может потом сам переписать в коде лиспа под себя.
Заранее спасибо!!!

Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 102
Размер:	63.2 Кб
ID:	252193  

Просмотров: 5036
 
Непрочитано 22.12.2022, 12:23
| 1 #2
Кулик Алексей aka kpblc
Moderator

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


А почему не использовать дин.блок?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.12.2022, 12:32
#3
Jek30


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А почему не использовать дин.блок?
Во-первых у этих прямоугольников всегда разные длины (а строить несколько блоков как-то неудобно).
Во-вторых мне потом надо будет как-то быстро посчитать длины этих прямоугольников (а считаю я их через лисп, "ELEN"), в блоках же дину не извлечешь лиспом "ELEN".
Jek30 вне форума  
 
Непрочитано 22.12.2022, 12:55
#4
Кулик Алексей aka kpblc
Moderator

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


Блок - один. С дин.параметром "растягивание". А длины можно посчитать через тот же _.dataextraction
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.12.2022, 13:03
#5
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,013


Как вариант - вставка блока с поворотом и масштабированием

(setq Point1 (getpoint "\nТочка 1 (вставки): "))
(setq Point2 (getpoint "\nТочка 2 (направление): "))
(setq Ang (/ (* (angle Point1 Point2) 180) pi))
(setq Sca (* (distance Point1 Point2) 2))
(vl-cmdf "_.-insert" "block" Point1 Sca 1 Ang "")
Вложения
Тип файла: dwg
DWG 2010
Test.dwg (53.7 Кб, 10 просмотров)

Последний раз редактировалось Nike, 22.12.2022 в 13:09.
Nike вне форума  
 
Автор темы   Непрочитано 22.12.2022, 13:06
#6
Jek30


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Блок - один. С дин.параметром "растягивание". А длины можно посчитать через тот же _.dataextraction
еслиб я еще, умелбы дин блок создавать, кстати я сейчас пытаюсь , такой создать
Jek30 вне форума  
 
Автор темы   Непрочитано 22.12.2022, 13:14
#7
Jek30


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


Цитата:
Сообщение от Nike Посмотреть сообщение
Как вариант - вставка блока с поворотом и масштабированием
Почемуто этот лисп не до конца работает у меня
Вложения
Тип файла: lsp aaa2.lsp (289 байт, 8 просмотров)
Jek30 вне форума  
 
Непрочитано 22.12.2022, 13:17
#8
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,013


(DEFUN c:as (/ Point1 Point2 Ang Sca)
(setq Point1 (getpoint "\nТочка 1 (вставки): "))
(setq Point2 (getpoint "\nТочка 2 (направление): "))
(setq Ang (/ (* (angle Point1 Point2) 180) pi))
(setq Sca (* (distance Point1 Point2) 2))
(vl-cmdf "_.-insert" "block" Point1 Sca 1 Ang "")

----- добавлено через ~2 мин. -----
А не проще будет не прямоугольником, а мультилинией?
Nike вне форума  
 
Автор темы   Непрочитано 22.12.2022, 13:32
#9
Jek30


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


Цитата:
Сообщение от Nike Посмотреть сообщение
А не проще будет не прямоугольником, а мультилинией?
Имеешь ввиду полилинией?,

Цитата:
Сообщение от Nike Посмотреть сообщение
(DEFUN c:as (/ Point1 Point2 Ang Sca)
(setq Point1 (getpoint "\nТочка 1 (вставки): "))
(setq Point2 (getpoint "\nТочка 2 (направление): "))
(setq Ang (/ (* (angle Point1 Point2) 180) pi))
(setq Sca (* (distance Point1 Point2) 2))
(vl-cmdf "_.-insert" "block" Point1 Sca 1 Ang "")
Заработало! Почти то что надо. Ну можно и полилинией я думаю. Только можно ли чтоб это был не блок, а прямоугольник?

----- добавлено через ~47 мин. -----
Люди а вы знаете как вот эту строчку, в таком виде↓

^C^C_-insert;Название чертежа(без формата и без пробелов);\1;1;0;_EXPLODE;_last;_-purge;_Blocks;"Название чертежа(без формата и без пробелов)";_No;;;

Как ее прописать вместо "block" из этой строчки↓

(vl-cmdf "_.-insert" "block" Point1 Sca 1 Ang "")

Но что бы в лиспе это читалось!???

Я короче подумал что это должно сработать. Но не уверен
Jek30 вне форума  
 
Непрочитано 23.12.2022, 07:08
#10
МишаИнженер


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


Цитата:
Сообщение от Jek30 Посмотреть сообщение
Только можно ли чтоб это был не блок, а прямоугольник?
Ширина прямоугольника 0,4 и при черчении будет равна 0,4?
МишаИнженер вне форума  
 
Автор темы   Непрочитано 23.12.2022, 07:13
#11
Jek30


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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Ширина прямоугольника 0,4 и при черчении будет равна 0,4?
Да 0,4 мм как на кортинке в вопросе темы, а если надо я бы наверное потом и сам бы изменил размер в коде лиспа.
Jek30 вне форума  
 
Непрочитано 23.12.2022, 07:34
#12
МишаИнженер


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


Ну тогда надо вычислить координаты 4 точек на расстоянии 0,4/2 от точек привязки задавая угол +-pi/2 к углу оси трубы. Когда координаты 4 точек будут вычислены, по этим координатам надо построить полилинию и потом замкнуть её. Это не сильно сложно. Непонятно только какой командой надо строить полилинию на ЛИСП.
МишаИнженер вне форума  
 
Автор темы   Непрочитано 23.12.2022, 07:50
#13
Jek30


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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Ну тогда надо вычислить координаты 4 точек на расстоянии 0,4/2 от точек привязки задавая угол +-pi/2 к углу оси трубы. Когда координаты 4 точек будут вычислены, по этим координатам надо построить полилинию и потом замкнуть её. Это не сильно сложно. Непонятно только какой командой надо строить полилинию на ЛИСП.
А есть какой то способ чтобы строить прямоугольник (_rectang) по двум точкам НЕ по нижнему левому углу и правому верхнему углу, А именно по другим двум точкам (в нашем случае например от центральной точки левой стороны (или центра прямоугольника) и по центральной точке правой стороны )?

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Непонятно только какой командой надо строить полилинию на ЛИСП.
_pline?? или _rectang??
Jek30 вне форума  
 
Непрочитано 23.12.2022, 09:44
#14
МишаИнженер


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


Прямоугольник всегда строится вдоль осей X и Y. Задать поворот прямоугольнику нельзя. Надо получить координаты 4 точек и потом по этим точкам построить замкнутую полилинию. На VBA для этого есть команда addLWPLine, а на ЛИСП какая для этого используется команда? Вроде бы эта команда называется vla-addLightweightPolyline. Надо найти примеры с использованием этой команды
МишаИнженер вне форума  
 
Непрочитано 23.12.2022, 09:52
#15
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,813


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Задать поворот прямоугольнику нельзя.
можно
Нажмите на изображение для увеличения
Название: Rectangle.png
Просмотров: 42
Размер:	10.6 Кб
ID:	252208
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 23.12.2022, 09:59
#16
Jek30


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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Прямоугольник всегда строится вдоль осей X и Y. Задать поворот прямоугольнику нельзя. Надо получить координаты 4 точек и потом по этим точкам построить замкнутую полилинию. На VBA для этого есть команда addLWPLine, а на ЛИСП какая для этого используется команда? Вроде бы эта команда называется vla-addLightweightPolyline. Надо найти примеры с использованием этой команды
А если поколдовать с этой строчкой↓
(command "_.PLINE" z '(0 297) '(0 297) v "_C")

где "z" и "v"
(setq z (getpoint "\nУкажите базовую точку : "))
(setq v (getpoint "\nУкажите базовую точку : "))

А как координаты прописать по другому, чтоб "необходимый мне" прямоугольник построился, я не знаю. ;0
Jek30 вне форума  
 
Непрочитано 23.12.2022, 10:16
#17
МишаИнженер


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


Цитата:
Сообщение от Jek30 Посмотреть сообщение
'(0 297)
Что это обозначает?
Если строить через командную строку, то лучше использовать команду _rectang.
Через указанные две точки находится длина прямоугольника и угол поворота.
Далее строится прямоугольник заданной длины и высоты (0,4) и потом поворачивается на вычисленный угол.
Можно сделать команду построения прямоугольника заданной длины, а потом повернуть его "вручную"
(setq Point1 (getpoint "\nТочка 1 (вставки): "))
(setq Point2 (getpoint "\nТочка 2 (направление): "))
(setq Length (* (distance Point1 Point2) 2))
(command "_rectang @" Length "0.4")

Последний раз редактировалось МишаИнженер, 23.12.2022 в 10:24.
МишаИнженер вне форума  
 
Непрочитано 23.12.2022, 10:29
#18
Кулик Алексей aka kpblc
Moderator

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


Для создания полилинии - либо vla-addlightweightpolyline, либо entmake / entmakex.
Для вычисления координат - polar.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.12.2022, 11:11
#19
Jek30


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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Что это обозначает?
Ну это я так, для образца взял случайные числа. А вообще
'(0 297)
это так координаты точки записываются в лиспе, где "0"- это по иксу, а "297" это по игрику
Jek30 вне форума  
 
Непрочитано 23.12.2022, 11:26
#20
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,013


Как-то так:
Код:
[Выделить все]
 
(defun C:as (/ IP LEN ANG THK P P1 P2 P3 P4)
  (setq	IP (getpoint "\nТочка вставки : ")
	P1 (getpoint IP "\nНаправление : ")
  )
  (setq THK (getdist "\nШирина <0.4>: "))
  (if (= THK nil)
    (setq THK 0.4)
  )
  (setq	ANG (+ (RTD (angle IP P1)) 90.0)
	LEN (distance IP P1)
	P   (polar IP (DTR (+ ANG 180.0)) (/ THK 2))
	P1  (polar P (DTR (+ ANG 270.0)) LEN)
	P2  (polar P1 (DTR ANG) THK)
	P3  (polar P2 (DTR (+ ANG 90.0)) (* LEN 2))
	P4  (polar P (DTR (+ ANG 90.0)) LEN)
  )
  (command "_pline" P1 P2 P3 P4	"_c")
  (princ)
)

;;;*======================================================
;*-----------------------------------------------------------------------------
;*dtr converts degrees to radians
(defun dtr (a)
  (* PI (/ a 180))
)
;*-----------------------------------------------------------------------------
;*rtd converts radians to degrees
(defun rtd (a)
  (/ (* a 180) PI)
)
;*-----------------------------------------------------------------------------





Последний раз редактировалось Nike, 23.12.2022 в 11:35.
Nike вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как вставить один прямоугольник через лисп?

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эвакуация из категории А через категорию В проект 1234 Пожарная безопасность 1 02.06.2017 18:01
Изменить значение в таблице через Лисп kurstep LISP 5 14.08.2014 18:07
Цикл печати изображений в файл, через Лисп proektant-minsk LISP 7 26.09.2012 20:30
Через 25 лет стоимость эксплуатации превышает стоимость строительства ? Tyhig Архитектура 41 24.08.2011 11:00
Не могу скопировать файл один в другой через буфер обмена AnnaS AutoCAD 4 12.07.2010 22:25