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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Построение фигуры через AutoLISP

Построение фигуры через AutoLISP

Ответ
Поиск в этой теме
Непрочитано 17.02.2008, 18:22
Построение фигуры через AutoLISP
severnet
 
Регистрация: 17.02.2008
Сообщений: 5

Программно реализовать построение одного из условных обозначений в среде AutoCAD с помощью языка AutoLISP (VisualLISP). Ввод входных данных организовать через командную строку AutoCAD, предусмотреть проверку вводимых данных на допустимость. Подскажите пожалуйста, как это сделать? Очень срочно!
Просмотров: 13550
 
Непрочитано 12.05.2009, 20:08
#21
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,518


через Command сделай, обычными отрезками или полилинией
Рyslan вне форума  
 
Непрочитано 12.05.2009, 20:11
#22
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Но тогда мне придется указывать точки вручную? Это нежелательно
skkkk вне форума  
 
Непрочитано 12.05.2009, 20:12
#23
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,518


почему вручную. можно с помощью мышки. только привязаться нужно будет
только наверное нада будет размеры прямоугольника задавать через ком строку и точку привязки
Рyslan вне форума  
 
Непрочитано 12.05.2009, 20:29
#24
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Так ведь у меня цель - нарисовать окно в три касания (кнопка с макросом, первая точка, вторая точка). А так это уже совсем не три будет. Как программно дальше обработать эту злосчастную линию, я догадываюсь, а вот программно ее начертить....
skkkk вне форума  
 
Непрочитано 12.05.2009, 20:33
#25
Кулик Алексей aka kpblc
Moderator

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


Извини, конечно, но дин.блок чем тебе не нравится?
А так, если без особых проверок и изысков, то
Код:
[Выделить все]
(defun test1 (/ adoc ent coord norm long)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (and (= (type
                (setq
                  ent (vl-catch-all-apply
                        (function
                          (lambda ()
                            (car (entsel "\nSelect a rectangle <Cancel> : "))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
                ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           (= (cdr (assoc 90 (entget ent))) 4)
           (= (cdr (assoc 70 (entget ent))) 1)
           ) ;_ end of and
    (progn
      (setq norm  (cdr (assoc 210 (entget ent)))
            coord (mapcar
                    'cdr
                    (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
                    ) ;_ end of mapcar
            long  (entmakex
                    (list
                      (cons 0 "LINE")
                      (cons 10
                            (mapcar
                              (function
                                (lambda (a b)
                                  (* (+ a b) 0.5)
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              (car coord)
                              (cadr coord)
                              ) ;_ end of mapcar
                            ) ;_ end of cons
                      (cons 11
                            (mapcar (function
                                      (lambda (a b)
                                        (* (+ a b) 0.5)
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    (last coord)
                                    (caddr coord)
                                    ) ;_ end of mapcar
                            ) ;_ end of cons
                      ) ;_ end of list
                    ) ;_ end of entmakex
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

(defun test2 (/ adoc ent coord norm long)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (and (= (type
                (setq
                  ent (vl-catch-all-apply
                        (function
                          (lambda ()
                            (car (entsel "\nSelect a rectangle <Cancel> : "))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
                ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           (= (cdr (assoc 90 (entget ent))) 4)
           (= (cdr (assoc 70 (entget ent))) 1)
           ) ;_ end of and
    (progn
      (setq norm  (cdr (assoc 210 (entget ent)))
            coord (mapcar
                    'cdr
                    (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
                    ) ;_ end of mapcar
            long  (entmakex
                    (list
                      (cons 0 "LINE")
                      (cons 10
                            (mapcar
                              (function
                                (lambda (a b)
                                  (* (+ a b) 0.5)
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              (car coord)
                              (last coord)
                              ) ;_ end of mapcar
                            ) ;_ end of cons
                      (cons 11
                            (mapcar (function
                                      (lambda (a b)
                                        (* (+ a b) 0.5)
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    (cadr coord)
                                    (caddr coord)
                                    ) ;_ end of mapcar
                            ) ;_ end of cons
                      ) ;_ end of list
                    ) ;_ end of entmakex
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.05.2009, 20:55
#26
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


С дин.блоком четыре касания выходит минимум. И не выходит у меня дин блок сделать, чтоб прямоугольник растягивался сразу и по Х и по У. Знаю, надо поглубже покопать.
За код спасибо большое. Супер! Только вот хотелось бы, чтоб он делал прямую, соединяющую именно середины коротких сторон,а во втором случае - именно середины длинных, а не вертикальную или горизонтальную линию чертил. Можно так?
skkkk вне форума  
 
Непрочитано 12.05.2009, 21:04
#27
Кулик Алексей aka kpblc
Moderator

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


Чего-чего? Я специально делал, чтоб для прямоугольника повернутого под любым углом рисовался отрезок, соединяющий середины длинных (функция (test1)) или коротких (функция (test2)) сторон. Если прямоугольник имеет стороны, повернутые вертикально и горизонтально, то эти отрезки и будут располагаться вертикально и горизонтально.
Или показывай образец, где результат неверный.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.05.2009, 21:25
#28
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Оба прямоугольника обработаны функцией (test1)
Вложения
Тип файла: dwg
DWG 2007
Чертеж1.dwg (60.8 Кб, 1399 просмотров)
skkkk вне форума  
 
Непрочитано 12.05.2009, 21:48
#29
Кулик Алексей aka kpblc
Moderator

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


Понятно, надо будет еще и проверку расстояний делать Ладно, сейчас...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.05.2009, 22:01
#30
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,518


может сделаете склад лиспов на форуме? а то искать их по темам...
Рyslan вне форума  
 
Непрочитано 12.05.2009, 22:02
#31
Кулик Алексей aka kpblc
Moderator

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


Рyslan, по-моему, их проще научиться самому рисовать
skkkk, тестируй:
Код:
[Выделить все]
(defun c:make-long (/ adoc ent coord norm long)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (and (= (type
                (setq
                  ent (vl-catch-all-apply
                        (function
                          (lambda ()
                            (car (entsel "\nSelect a rectangle <Cancel> : "))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
                ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           (= (cdr (assoc 90 (entget ent))) 4)
           (= (cdr (assoc 70 (entget ent))) 1)
           ) ;_ end of and
    (progn
      (setq norm  (cdr (assoc 210 (entget ent)))
            coord (mapcar
                    'cdr
                    (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
                    ) ;_ end of mapcar
            coord (vl-sort coord
                           '(lambda (a b)
                              (< (distance (car coord) a) (distance (car coord) b))
                              ) ;_ end of lambda
                           ) ;_ end of vl-sort
            long  (entmakex
                    (list
                      (cons 0 "LINE")
                      (cons 10
                            (mapcar
                              (function
                                (lambda (a b)
                                  (* (+ a b) 0.5)
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              (car coord)
                              (cadr coord)
                              ) ;_ end of mapcar
                            ) ;_ end of cons
                      (cons 11
                            (mapcar (function
                                      (lambda (a b)
                                        (* (+ a b) 0.5)
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    (last coord)
                                    (caddr coord)
                                    ) ;_ end of mapcar
                            ) ;_ end of cons
                      ) ;_ end of list
                    ) ;_ end of entmakex
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

(defun c:make-short (/ adoc ent coord norm long)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (and (= (type
                (setq
                  ent (vl-catch-all-apply
                        (function
                          (lambda ()
                            (car (entsel "\nSelect a rectangle <Cancel> : "))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
                ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           (= (cdr (assoc 90 (entget ent))) 4)
           (= (cdr (assoc 70 (entget ent))) 1)
           ) ;_ end of and
    (progn
      (setq norm  (cdr (assoc 210 (entget ent)))
            coord (mapcar
                    'cdr
                    (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
                    ) ;_ end of mapcar
            coord (vl-sort coord
                           '(lambda (a b)
                              (< (distance (car coord) a) (distance (car coord) b))
                              ) ;_ end of lambda
                           ) ;_ end of vl-sort
            long  (entmakex
                    (list
                      (cons 0 "LINE")
                      (cons 10
                            (mapcar
                              (function
                                (lambda (a b)
                                  (* (+ a b) 0.5)
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              (car coord)
                              (caddr coord)
                              ) ;_ end of mapcar
                            ) ;_ end of cons
                      (cons 11
                            (mapcar (function
                                      (lambda (a b)
                                        (* (+ a b) 0.5)
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    (cadr coord)
                                    (cadddr coord)
                                    ) ;_ end of mapcar
                            ) ;_ end of cons
                      ) ;_ end of list
                    ) ;_ end of entmakex
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.05.2009, 22:08
#32
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,518


ну все равно, сколько уже этих программ ты создал для разных людей и целей. собрать бы это все в отдельную тему
Рyslan вне форума  
 
Непрочитано 12.05.2009, 22:21
#33
Кулик Алексей aka kpblc
Moderator

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


Вот скажи, а на фига? Все равно у каждого свои задачи, свои условия применения и т.п.
Вот последний код, например, неверно будет срабатывать, если полилиния отрисована не в мировой системе координат и (или) имеет уровень (elevation) не равным 0. Он не будет обрабатывать полилинии, лежащие внутри блоков. Он попытается сработать на любой замкнутой полилинии, если у нее 4 вершины (но при этом не отслеживается ни совпадение вершин, ни углы между ними). То есть код "на 5 минут и кружку кофе"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.05.2009, 22:29
#34
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,518


ну как хотите
Рyslan вне форума  
 
Непрочитано 12.05.2009, 22:34
#35
Кулик Алексей aka kpblc
Moderator

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


Рyslan, лично я свои без малого 16 000 сообщений даже просто физически отфильтровать не могу Коды VVA намного более "юзабельны", но попробуй - найди их все!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.05.2009, 16:55
#36
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


А может быть удобнее окна и двери вставлять блоками из ToolPalettes?
E-degtyarev вне форума  
 
Непрочитано 13.05.2009, 19:18
#37
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Дай Бог тебе здоровья, Алексей! Все отлично работает. Я добился-таки своего, теперь три клика оставляют после себя окно или дверь. Я скрестил твой лисп с парочкой других макросом и балдею.
А насчет Tool Pallettes ничего сказать не могу - не пользуюсь, но сомневаюсь, что в три клика они справятся:-). Но надо попробовать - люблю всё новое.
skkkk вне форума  
 
Непрочитано 02.09.2011, 17:27
#38
valentin81

Студент
 
Регистрация: 20.06.2007
Пермь ПГСХА
Сообщений: 9


[quote=skkkk;395206]Дай Бог тебе здоровья, Алексей! Все отлично работает. Я добился-таки своего, теперь три клика оставляют после себя окно или дверь. Я скрестил твой лисп с парочкой других макросом и балдею.
А насчет Tool Pallettes ничего сказать не могу - не пользуюсь, но сомневаюсь, что в три клика они справятся:-). Но надо попробовать - люблю всё новое.[/QUO

Всем привет! Есть ли что с AutoLISP дружит. Надо чертежик не сложный отобразить в программе. Помогите плиз
__________________
Люди нужен альбом Шерешевского и другие книги с узлами пром и гражданских зданий! у кого ест поделитесь
valentin81 вне форума  
 
Непрочитано 02.09.2011, 18:38
#39
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


???

Последний раз редактировалось gomer, 03.09.2011 в 13:00.
gomer вне форума  
 
Непрочитано 03.09.2011, 09:28
#40
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Цитата:
Сообщение от valentin81 Посмотреть сообщение
А насчет Tool Pallettes ничего сказать не могу - не пользуюсь, но сомневаюсь, что в три клика они справятся:-). Но надо попробовать - люблю всё новое.
Tool Pallettes справляются аж за 2 клика!
E-degtyarev вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Построение фигуры через AutoLISP