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

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

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

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

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

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

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

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


А почему не использовать дин.блок?
__________________
Моя библиотека 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,450


Блок - один. С дин.параметром "растягивание". А длины можно посчитать через тот же _.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,817


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Задать поворот прямоугольнику нельзя.
можно
Нажмите на изображение для увеличения
Название: 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,450


Для создания полилинии - либо 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 вне форума  
 
Непрочитано 23.12.2022, 11:39
#21
Кулик Алексей aka kpblc
Moderator

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


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
Талды-Париж
Сообщений: 6,013


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 40,450


Код:
[Выделить все]
 (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
Талды-Париж
Сообщений: 6,013


Еще вариант
Код:
[Выделить все]
 (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
С.-Петербург
Сообщений: 40,450


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
Талды-Париж
Сообщений: 6,013


Цитата:
Сообщение от 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,817


Код:
[Выделить все]
 
(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,837


Извращенцы

Динблоки же есть...
Решается штатными средствами за 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,372


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

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

Сумму этих длин также легко извлечь.
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,837


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

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


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


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


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

П.С Кто-нибудь пожалуйста, поможет с решением проблемы "глобальной ширины" полилинии из поста #33 ?
Как сделать чтоб глобальная ширина полилинии учитывалась в последнем лиспе?
Jek30 вне форума  
 
Непрочитано 28.12.2022, 12:16
#41
Krieger

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


Цитата:
Сообщение от Jek30 Посмотреть сообщение
Ну я попробовал дин блокам, оно конечно упрощает мою задачу, но это всё равно не то, слишком много лишних дополнительных действий, а вот в лиспе Nike эти лишние действия сведены к нулю (не, ну конечно и его наверное можно еще больше автоматизировать, но даже и в таком виде это намного лучше чем дин . блок)
По мне так наоборот. Ну да ладно.
Цитата:
Сообщение от Jek30 Посмотреть сообщение
П.С Кто-нибудь пожалуйста, поможет с решением проблемы "глобальной ширины" полилинии из поста #33 ?
Как сделать чтоб глобальная ширина полилинии учитывалась в последнем лиспе?
У меня ширина назначается, всё работает. В этот лисп надо добавить отключение привязок, иначе прямоугольники могут не получиться и прерывание команды, если точки не указаны.

----- добавлено через ~6 мин. -----
Цитата:
Сообщение от AMDen Посмотреть сообщение
- блоки разбивать не обязательно, полилинию можно также из блоков извлечь.
Каким образом?
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 28.12.2022, 12:34
#42
Jek30


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
У меня ширина назначается, всё работает.
А ты говоришь точно про глобальную ширину а не про вес линии? Может ты путаешь?
Jek30 вне форума  
 
Непрочитано 28.12.2022, 13:11
#43
AMDen

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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Каким образом?
Так
Миниатюры
Нажмите на изображение для увеличения
Название: Сохраненное изображение 2022-12-28_13-10-28.586.jpg
Просмотров: 35
Размер:	80.8 Кб
ID:	252300  
AMDen вне форума  
 
Непрочитано 28.12.2022, 17:54
#44
Krieger

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


Цитата:
Сообщение от Jek30 Посмотреть сообщение
А ты говоришь точно про глобальную ширину а не про вес линии? Может ты путаешь?
Setvar то срабатывает, только потом толщина устанавливается в функции command ("_W" "20" "20").

Код:
[Выделить все]
 (defun C:as ( / ptc dir wide ang high)
  (if (setq	ptc   (getpoint "\nТочка вставки : "))
    (if (setq dir (getpoint ptc "\nНаправление : "))
      (progn
	(setq    
		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)
  (command "_.PLINE"	   "_none" ptll	   "_W"	   "20"	   "20"	   ".X"
	   "_none" ptur	   ".Y"	   "_none" ptll	   "_none" ptur	   ".X"	   "_none" ptll	   ".Y"
	   "_none"ptur	   "_C"
	  )
  (command "_ROTATE" (entlast) "" "_none" ptc ang "")
  (command "_chprop" (entlast) "" "_layer" "0" "_color" 5 "_Lweight" 2 "_Ltscale" 2 "_Ltype" "ACAD_ISO02W100" "")
	)
      )
    )
)

Цитата:
Сообщение от AMDen Посмотреть сообщение
Так
Ну стоит галочка, дальше что?

Так-то я расчленил, чтобы показать автору, что он может воспользоваться своей программкой подсчёта длин, даже если пользуется блоками.
Миниатюры
Нажмите на изображение для увеличения
Название: 2022-12-28_214944.png
Просмотров: 23
Размер:	22.9 Кб
ID:	252307  
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 29.12.2022, 06:35
#45
Jek30


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Setvar то срабатывает, только потом толщина устанавливается в функции command ("_W" "20" "20").
О Спасибо!! А я и не знал даже.
Jek30 вне форума  
 
Непрочитано 29.12.2022, 09:53
1 | #46
AMDen

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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Ну стоит галочка, дальше что?
Дальше выводится список полилиний (или прочего), содержащихся в блоках. И их уже можно считать, как если бы они были не в блоке.
AMDen вне форума  
Ответ
Вернуться   Форум 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