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

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

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

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

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

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

Просмотров: 4587
 
Непрочитано 23.12.2022, 11:39
#21
Кулик Алексей aka kpblc
Moderator

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


Nike, про привязки забыл. И вообще, на фига пользоваться командами, когда можно и без оных обойтись? ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.12.2022, 11:50
| 1 #22
Jek30


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


Цитата:
Сообщение от Nike Посмотреть сообщение
Как-то так:
Вот это, Да! Все работает как я и хотел! Спасибо Большое!!
А могу ли я тебя попросить пожалуйста еще добавить в лисп такие фишки, чтоб можно было бы менять слой, толщину, цвет и тип линии прямоугольника? (всмысле чтобы эти фишки были только в самом коде лиспа и все, в автокаде не нужны (для этого всплывающие (рамки-спрашивалки)))
Jek30 вне форума  
 
Непрочитано 23.12.2022, 12:03
#23
Nike

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


Цитата:
Сообщение от Jek30 Посмотреть сообщение
Спасибо Большое!!
Не за что. Самому подобная фигня была нужна, поэтому и ввязался.
Цитата:
Сообщение от Jek30 Посмотреть сообщение
А могу ли я тебя попросить пожалуйста еще добавить в лисп такие фишки, чтоб можно было бы менять слой, толщину, цвет и тип линии прямоугольника?
Ниасилю. Или долго буду возиться. А потом ещё Крыс опять засмеёт. Я в лиспе круглый нуль.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И вообще, на фига пользоваться командами, когда можно и без оных обойтись? ))
Чего?
Nike вне форума  
 
Автор темы   Непрочитано 23.12.2022, 12:20
#24
Jek30


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


Цитата:
Сообщение от Nike Посмотреть сообщение
Не за что. Самому подобная фигня была нужна, поэтому и ввязался.
А ты что тоже какие-то сети проектируешь?
Цитата:
Сообщение от Nike Посмотреть сообщение
Ниасилю. Или долго буду возиться. А потом ещё Крыс опять засмеёт. Я в лиспе круглый нуль.
Это ты то, ноль???! Такую штуку смастерил!! Я бы не сказал. Вот я, да, ноль.
А ты что с Талдыка чтоли?

Жаль что нет желания мою доработку сделать, так бы ваще лисп огонь получился бы. Ну ладно тогда просто можно в автокаде выставить нужные текущий слой, цвет... и прямоугольник построится в нужном стиле. Спасибо еще раз большое!!!
Jek30 вне форума  
 
Непрочитано 23.12.2022, 12:29
#25
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun f1 (/ start end ang dist)
  (if (and (= (type
                (setq start (vl-catch-all-apply (function (lambda () (getpoint "\nStart point <Cancel> : ")))))
              ) ;_ end of type
              'list
           ) ;_ end of =
           start
           (= (type
                (setq end (vl-catch-all-apply (function (lambda () (getpoint start "\nEnd point <Cancel> : ")))))
              ) ;_ end of type
              'list
           ) ;_ end of =
           end
      ) ;_ end of and
    (progn
      (setq ang  (angle start end)
            dist 0.2
      ) ;_ end of setq

      (entmakex (append '((0 . "LWPOLYLINE")
                          (100 . "AcDbEntity")
                          (67 . 0)
                          (100 . "AcDbPolyline")
                          (90 . 4)
                          (70 . 1)
                         )
						 (list (cons 8 "ИмяСлоя")
					;	 (cons 6 "ИмяЗагруженногоТипаЛинии")
						 (cons 62 2) ; номер цвета
						 (cons 370 aclnwt200) ; вес линии
						 (cons 48 1) ; масштаб линии
						 (cons 43 0) ; установленная глобальная ширина полилинии
						 )
                        (mapcar (function (lambda (x)
                                            (cons 10 x)
                                          ) ;_ end of LAMBDA
                                ) ;_ end of function
                                (list (polar start (+ ang (* pi 0.5)) dist)
                                      (polar start (- ang (* pi 0.5)) dist)
                                      (polar end (- ang (* pi 0.5)) dist)
                                      (polar end (+ ang (* pi 0.5)) dist)
                                ) ;_ end of list
                        ) ;_ end of mapcar
                ) ;_ end of append
      ) ;_ end of entmakex
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2022, 13:00
#26
Nike

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


Еще вариант
Код:
[Выделить все]
 (defun C:as ( / ptc dir wide ang high)
  (setq	ptc   (getpoint "\nТочка вставки : ")
	dir (getpoint ptc "\nНаправление : ")
	wide  (* 2 (distance ptc dir))
	ang (/ (* (angle ptc dir) 180) PI) 
	high  (getdist "\nШирина <0.4>: ")
	)
(if (= high nil)
    (setq high 0.4)
  )
  (setq	
	hwide (/ wide 2.0)
	hhigh (/ high 2.0)
	ptll  (list (- (car ptc) hwide) (- (cadr ptc) hhigh))
	ptur  (list (+ (car ptll) wide) (+ (cadr ptll) high))
  )
 (command "_.pline"	   ptll	   "_w"	   "0"	   "0"	   ".x"
	   ptur	   ".y"	   ptll	   ptur	   ".x"	   ptll	   ".y"
	   ptur	   "_c"
	  )
  (command "_rotate" (entlast) "" ptc ang "")
)

Последний раз редактировалось Nike, 23.12.2022 в 13:53.
Nike вне форума  
 
Автор темы   Непрочитано 23.12.2022, 13:19
#27
Jek30


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Другой вариант. Тоже не фонтан, конечно
Да, тоже хороший, правда он чертит не от середины, а от края до края прямоугольника.
Вот бы еще закинуть бы как то эти строчки в лисп "Nike"↓
(list (cons 8 "ИмяСлоя")
; (cons 6 "ИмяЗагруженногоТипаЛинии")
(cons 62 2) ; номер цвета
(cons 370 aclnwt200) ; вес линии
(cons 48 1) ; масштаб линии
(cons 43 0) ; установленная глобальная ширина полилинии
)


----- добавлено через ~6 мин. -----
Цитата:
Сообщение от Nike Посмотреть сообщение
Еще вариант
Автокад почему то пишет : "Не верно сформированный список на входе"
Jek30 вне форума  
 
Непрочитано 23.12.2022, 13:26
#28
Кулик Алексей aka kpblc
Moderator

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


Jek30, советую попробовать разобраться самостоятельно. Подсказка: если использовать код от Nike, то работать с системными переменными.
Nike, кажется, ты забыл про "/" в параметрах команды.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.12.2022, 13:29
#29
Jek30


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Jek30, советую попробовать разобраться самостоятельно. Подсказка: если использовать код от Nike, то работать с системными переменными.
Это копец как тяжело для меня, но я постараюсь. А за помощь Спасибо большое!
И всех остальных тоже благодарю: МишаИнженер и Nike. Спасибо!!!
Jek30 вне форума  
 
Непрочитано 23.12.2022, 13:46
#30
Nike

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


Цитата:
Сообщение от Jek30 Посмотреть сообщение
Вот бы еще закинуть бы как то эти строчки в лисп "Nike"↓
(list (cons 8 "ИмяСлоя")
; (cons 6 "ИмяЗагруженногоТипаЛинии")
(cons 62 2) ; номер цвета
(cons 370 aclnwt200) ; вес линии
(cons 48 1) ; масштаб линии
(cons 43 0) ; установленная глобальная ширина полилинии
добавь в конце что-то типа
(command "_chprop" (entlast) "" "_layer" "0" "_color" 5 "_Lweight" "2" "_Ltscale" 2 "_Ltype" "ACAD_ISO02W100" "")

и черточку в параметрах команды
(defun C:as ( / ptc dir wide ang high)

Код:
[Выделить все]
 (defun C:as ( / ptc dir wide ang high)
  (setq	ptc   (getpoint "\nÒî÷êà âñòàâêè : ")
	dir (getpoint ptc "\nÍàïðàâëåíèå : ")
	wide  (* 2 (distance ptc dir))
	ang (/ (* (angle ptc dir) 180) PI) 
	high  (getdist "\nØèðèíà <0.4>: ")
	)
(if (= high nil)
    (setq high 0.4)
  )
  (setq	
	hwide (/ wide 2.0)
	hhigh (/ high 2.0)
	ptll  (list (- (car ptc) hwide) (- (cadr ptc) hhigh))
	ptur  (list (+ (car ptll) wide) (+ (cadr ptll) high))
  )
  
  (setvar "plinewid" 0.0)
  (command "_.PLINE"	   ptll	   "_W"	   "0"	   "0"	   ".X"
	   ptur	   ".Y"	   ptll	   ptur	   ".X"	   ptll	   ".Y"
	   ptur	   "_C"
	  )
  (command "_ROTATE" (entlast) "" ptc ang "")
  (command "_chprop" (entlast) "" "_layer" "0" "_color" 5 "_Lweight" 2 "_Ltscale" 2 "_Ltype" "ACAD_ISO02W100" "") 
)
Nike вне форума  
 
Автор темы   Непрочитано 23.12.2022, 13:58
#31
Jek30


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


Цитата:
Сообщение от Nike Посмотреть сообщение
добавь в конце что-то типа
(command "_chprop" (entlast) "" "_layer" "0" "_color" 5 "_Lweight" "2" "_Ltscale" 2 "_Ltype" "ACAD_ISO02W100" "")

и черточку в параметрах команды
(defun C:as ( / ptc dir wide ang high)
Всё заработало! Полностью прям как я и хотел! Большое спасибо!
Jek30 вне форума  
 
Непрочитано 26.12.2022, 13:36
#32
koMon


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


Код:
[Выделить все]
 
(setq rect_center_point (getpoint "\nПересечение: ")
	  rect_half_length_point (getpoint rect_center_point "\nТочка половины длины прямоугольника: ")
	  diagonal_angle (atan (/ 0.2 (distance rect_center_point rect_half_length_point)))
	  half_diagonal_length (sqrt (+ (expt (distance rect_center_point rect_half_length_point) 2) 0.04))
)
(command "_rectang" "_non" (polar rect_center_point (+ diagonal_angle (angle rect_center_point rect_half_length_point)) half_diagonal_length) 
					"_r" (angtos (angle rect_center_point rect_half_length_point) 0 16)
					"_non" (polar rect_center_point (+ pi diagonal_angle (angle rect_center_point rect_half_length_point)) half_diagonal_length) 
)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 26.12.2022, 13:52
#33
Jek30


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


Цитата:
Сообщение от koMon Посмотреть сообщение
(setq rect_center_point (getpoint "\nПересечение: ")
rect_half_length_point (getpoint rect_center_point "\nТочка половины длины прямоугольника: ")
diagonal_angle (atan (/ 0.2 (distance rect_center_point rect_half_length_point)))
half_diagonal_length (sqrt (+ (expt (distance rect_center_point rect_half_length_point) 2) 0.04))
)
(command "_rectang" "_non" (polar rect_center_point (+ diagonal_angle (angle rect_center_point rect_half_length_point)) half_diagonal_length)
"_r" (angtos (angle rect_center_point rect_half_length_point) 0 16)
"_non" (polar rect_center_point (+ pi diagonal_angle (angle rect_center_point rect_half_length_point)) half_diagonal_length)
)
Благодарю! Хоть я и не разбераюсь в лиспах, но мне показался этот лисп написанным каким-то необычным способом что ли, но тоже работает. Только в нем нет свойств полилинии.
Спасибо!

----- добавлено через ~19 ч. -----
Цитата:
Сообщение от Nike Посмотреть сообщение
добавь в конце что-то типа
(command "_chprop" (entlast) "" "_layer" "0" "_color" 5 "_Lweight" "2" "_Ltscale" 2 "_Ltype" "ACAD_ISO02W100" "")

и черточку в параметрах команды
(defun C:as ( / ptc dir wide ang high)

+
Привет! Извиняюсь за беспокойство. Не поможешь ли еще в одном моменте?
В общем еще важнное свойство для меня. В восемнадцатой строке твоего кода "(setvar "plinewid" 0.0)" , когда меняешь значение "глобальной ширины" например на "2" (в самом коде лиспа), и запускаешь лисп, то это свойство почему-то игнорируется и вообще ни как не учитывается. Как можно сделать чтобы оно учитывалось?

P/S Читающие это, если кто знает подскажите тоже пожалуйста! Спасибо!
Jek30 вне форума  
 
Непрочитано 27.12.2022, 17:53
#34
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Извращенцы

Динблоки же есть...
Решается штатными средствами за 5 мин:
https://youtu.be/wjORRrnRBQU

Хотя, согласен, написать прогу по отрисовке прямоугольника, при изучении LISP должен каждый.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 28.12.2022, 06:51
#35
Jek30


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Динблоки же есть...
Решается штатными средствами за 5 мин:
https://youtu.be/wjORRrnRBQU
Ну я создал такой блок, прикольная штука! А как выделить все эти десятки труб (по сотню) на плане и и узнать общую длину всех этих труб? (моим то способом я это за две секунды делал )
Ну выделить то ладно, хоть это и долгий способ но можно через "быстрый выбор", по параметру "имя" блока. А общую длину то всех труб как узнать?

Последний раз редактировалось Jek30, 28.12.2022 в 07:02.
Jek30 вне форума  
 
Непрочитано 28.12.2022, 07:18
#36
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Если вопрос только про футляры (они могут и не только прямоугольником изображаться), то не надо их рисовать ни "прямоугольниками", ни полилиниями, ни динамическими блоками.
Надо сделать обычный блок единичной длины с точкой вставки в начале футляра.

И микропрограмма для вставки - Начало футляра - Конец футляра.
Единичный блок вставляется в точку начало футляра под углом Начало-Конец и с масштабом по Х равным расстоянию между указанными точками. Этот масштаб и будет длиной футляра.

Сумму этих длин также легко извлечь.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 28.12.2022, 07:26
#37
Jek30


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
И микропрограмма для вставки - Начало футляра - Конец футляра.
Единичный блок вставляется в точку начало футляра под углом Начало-Конец и с масштабом по Х равным расстоянию между указанными точками. Этот масштаб и будет длиной футляра.

Сумму этих длин также легко извлечь.
Что за микропрограмма? Лисп что ли? Я еле этот лисп получил, к счастью нашлись добрые люди ! (Сам то я не лиспер)
Ну а общую длину всех футляров то, как извлечь?
Jek30 вне форума  
 
Непрочитано 28.12.2022, 09:57
#38
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Цитата:
Сообщение от Jek30 Посмотреть сообщение
Ну я создал такой блок, прикольная штука! А как выделить все эти десятки труб (по сотню) на плане и и узнать общую длину всех этих труб? (моим то способом я это за две секунды делал )
Ну выделить то ладно, хоть это и долгий способ но можно через "быстрый выбор", по параметру "имя" блока. А общую длину то всех труб как узнать?
Ну я же в видео двумя способами получил длину. Досмотри до конца.
Выбрать можно по названию блока или по слою.
Получить длину - Dataextraction, там даже выбирать не нужно.
Всегда можно расчленить, выбрать искомые отрезки и уже твоей программой определить их длину.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 28.12.2022, 10:21
#39
AMDen

Инженер-проектировщик
 
Регистрация: 07.07.2016
Санкт-Петербург
Сообщений: 723


Цитата:
Сообщение от Krieger Посмотреть сообщение
Динблоки же есть...
Решается штатными средствами за 5 мин:
https://youtu.be/wjORRrnRBQU
Дополню:
- суммарную ячейку можно сразу в извлечении добавить;
- блоки разбивать не обязательно, полилинию можно также из блоков извлечь.
AMDen вне форума  
 
Автор темы   Непрочитано 28.12.2022, 11:12
#40
Jek30


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


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

П.С Кто-нибудь пожалуйста, поможет с решением проблемы "глобальной ширины" полилинии из поста #33 ?
Как сделать чтоб глобальная ширина полилинии учитывалась в последнем лиспе?
Jek30 вне форума  
Ответ
Вернуться   Форум 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