Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 224
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12 1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 2048602
 
Непрочитано 26.10.2023, 17:18
#4461
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сам отфильтруешь лишнее:
Код:
[Выделить все]
 (defun _kpblc-eval-closest-mleader (vla-polyline vla-mleader-list)
  (vl-sort (mapcar
             (function
               (lambda (x / pt closest)
                 (setq pt      (vlax-safearray->list
                                 (vlax-variant-value
                                   (vla-getleaderlinevertices x 0)
                                 ) ;_ end of vlax-variant-value
                               ) ;_ end of vlax-safearray->list
                       pt      (list (car pt) (cadr pt) (caddr pt))
                       closest (vlax-curve-getclosestpointto vla-polyline pt)
                 ) ;_ end of setq
                 (setq x (list (cons "obj" x)
                               (cons "pt" pt)
                               (cons "closest" closest)
                               (cons "dist" (distance pt closest))
                         ) ;_ end of list
                 ) ;_ end of setq
               ) ;_ end of lambda
             ) ;_ end of function
             vla-mleader-list
           ) ;_ end of mapcar
           (function (lambda (a b)
                       (< (cdr (assoc "dist" a)) (cdr (assoc "dist" b)))
                     ) ;_ end of LAMBDA
           ) ;_ end of function
  ) ;_ end of vl-sort
) ;_ end of defun
----- добавлено через ~1 мин. -----
"obj" - указатель на мультивыноску
"pt" - начальная точка первого хвоста
"closest" - ближайшая точка на полилинии
"dist" - расстояние до полилинии
АА, я все-таки правильно копал, пойду разбираться. Спасибо большое.


UPD.
Только я немного не понял, я получил массив структур данных, где выноски отсартированы по дистанции.
А мне нужно было на выходе функции получить нужную выноску к передаваемой vla-pl и все

PS> Код крутой у тебя

Последний раз редактировалось gnuvse, 26.10.2023 в 18:09.
gnuvse вне форума  
 
Непрочитано 26.10.2023, 19:43
#4462
Кулик Алексей aka kpblc
Moderator

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


Так забирай car от результата и делай с ним чего хотишь, делов-то ) Это будет выноска, расстояние от полилинии до хвоста которой минимально. Берешь (cdr (assoc "obj" value)) - вот тебе указатель на выноску. Ну и теде.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2023, 20:02
#4463
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Так забирай car от результата и делай с ним чего хотишь, делов-то ) Это будет выноска, расстояние от полилинии до хвоста которой минимально. Берешь (cdr (assoc "obj" value)) - вот тебе указатель на выноску. Ну и теде.
Так зачем мне каждый раз такую структуру данных городить, если мне нужна одна выноска и выйти из цикла, получается, что если у меня будет 300 линий, то каждый раз мне нужно будет 300 выносок собрать, 90к раз =)
Я понимаю, что для быстрого процессора это фигня, но все равно, хачем лишние телодвижения

Я наковырял вот такой цикл, оно вроде даже работает, но честно признаться я немного не понимаю как оно работает.
Ты мог бы немного пояснить?

Самые близкие элементы по итогу имеют дистанцию 0, но мне немного непонятно, почему "(setq coordinate-mlead (cdr (nth key-coordinate-mlead (entget ent-mlead))))", вот это дает одинаковую координату с мультивыноской
Код:
[Выделить все]
 
	(setq LX 0.0)
	(setq mlead-found-flag nil)
	(setq elem 0)
	(while (not mlead-found-flag)
		(setq mlead (nth elem set-of-vla-mleads))
		(setq ent-mlead (vlax-vla-object->ename mlead))
		(setq coordinate-mlead (cdr (nth key-coordinate-mlead (entget ent-mlead))))
		(setq closer-pt (vlax-curve-getClosestPointTo vla-pl coordinate-mlead))

		
		(if (= LX (distance closer-pt coordinate-mlead))
			(progn
				(setq mlead-found-flag T)
				(setq mlead-found mlead)
			)
		)
		
		(setq elem (1+ elem))
	)
gnuvse вне форума  
 
Непрочитано 26.10.2023, 20:19
#4464
Кулик Алексей aka kpblc
Moderator

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


Ну, откуда и с какого перепугу ты берешь key-coordinate-mlead, я без понятия. И там в ename-представлении, ЕМНИП, не все настолько просто и однозначно, обычный (cdr (assoc ...)) может дать неправильные результаты. Кажется, там надо нечто типа
(cdr(assoc 10 (member '(0 . "{MLEADER_LINE") (entget (vlax-vla-object->ename vla-mleader-object))))) или что-то наподобие. Скажу честно, сейчас совсем в другой задаче, и ковыряться не могу.
Касаемо
Цитата:
Сообщение от gnuvse Посмотреть сообщение
если мне нужна одна выноска
что будет, если выноска попадает на пересечение двух и более полилиний? А сделать обработку сразу на список полилиний и список выносок не сложно, достаточо просто будет проходить (к примеру) по всем полилиниям, подставляя для сравнения постоянно уменьшающийся список выносок. Вариантов, конечно, масса, и мой гарантированно не является самым идеальным
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2023, 20:22
#4465
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну, откуда и с какого перепугу ты берешь key-coordinate-mlead, я без понятия. И там в ename-представлении, ЕМНИП, не все настолько просто и однозначно, обычный (cdr (assoc ...)) может дать неправильные результаты. Кажется, там надо нечто типа
(cdr(assoc 10 (member '(0 . "{MLEADER_LINE") (entget (vlax-vla-object->ename vla-mleader-object))))) или что-то наподобие. Скажу честно, сейчас совсем в другой задаче, и ковыряться не могу.
Касаемо


что будет, если выноска попадает на пересечение двух и более полилиний? А сделать обработку сразу на список полилиний и список выносок не сложно, достаточо просто будет проходить (к примеру) по всем полилиниям, подставляя для сравнения постоянно уменьшающийся список выносок. Вариантов, конечно, масса, и мой гарантированно не является самым идеальным
А, я не стал весь код кидать key-coordinate-mlead = 49, это элемент списка где координата выноски, сегодня вручную ковырял все это дело, выяснял. Извиняюсь

Да, твое решение универсальное, но мне как нубу, для практкии слишком сложновато все это разом охватить. Если будет время, просмотри пожалуйста, буду признателен
gnuvse вне форума  
 
Непрочитано 26.10.2023, 21:07
#4466
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от gnuvse Посмотреть сообщение
А, я не стал весь код кидать key-coordinate-mlead = 49, это элемент списка где координата выноски
Щщас тебе! Я возьму и в мультивыноску своих данных напихаю, и код пойдет глубоко и далеко. Вот тебе варианты получения начальных точек хвостов, сколько бы их ни было:
Код:
[Выделить все]
 (defun fun_get-startpoint-mleader-ename (mleader-ename / elist)
  (setq elist (member '(304 . "LEADER_LINE{") (entget mleader-ename))
        elist (reverse elist)
        elist (member '(301 . "}") elist)
        elist (reverse elist)
  ) ;_ end of setq
  (mapcar (function cdr)
          (vl-remove-if-not
            (function
              (lambda (x)
                (= (car x) 10)
              ) ;_ end of LAMBDA
            ) ;_ end of function
            elist
          ) ;_ end of vl-remove-if-not
  ) ;_ end of mapcar
) ;_ end of defun

(defun fun_get-startpoint-mleader-vla (mleader-vla / res point)
  (foreach item (vlax-safearray->list (vlax-variant-value (vla-getleaderlineindexes mleader-vla 0)))
    (setq point (vlax-safearray->list (vlax-variant-value (vla-getleaderlinevertices mleader-vla item)))
          point (list (car point) (cadr point) (caddr point))
          res   (cons point res)
    ) ;_ end of setq
  ) ;_ end of foreach
  (reverse res)
) ;_ end of defun
Цитата:
Сообщение от gnuvse Посмотреть сообщение
слишком сложновато все это разом охватить
Да там вроде ничего особо сложного. Саму идею понял или стоит объяснить? Спрашиваю без сарказма, просто из меня учитель как из слона балерина.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2023, 21:48
#4467
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Щщас тебе! Я возьму и в мультивыноску своих данных напихаю, и код пойдет глубоко и далеко. Вот тебе варианты получения начальных точек хвостов, сколько бы их ни было:
Код:
[Выделить все]
 (defun fun_get-startpoint-mleader-ename (mleader-ename / elist)
  (setq elist (member '(304 . "LEADER_LINE{") (entget mleader-ename))
        elist (reverse elist)
        elist (member '(301 . "}") elist)
        elist (reverse elist)
  ) ;_ end of setq
  (mapcar (function cdr)
          (vl-remove-if-not
            (function
              (lambda (x)
                (= (car x) 10)
              ) ;_ end of LAMBDA
            ) ;_ end of function
            elist
          ) ;_ end of vl-remove-if-not
  ) ;_ end of mapcar
) ;_ end of defun

(defun fun_get-startpoint-mleader-vla (mleader-vla / res point)
  (foreach item (vlax-safearray->list (vlax-variant-value (vla-getleaderlineindexes mleader-vla 0)))
    (setq point (vlax-safearray->list (vlax-variant-value (vla-getleaderlinevertices mleader-vla item)))
          point (list (car point) (cadr point) (caddr point))
          res   (cons point res)
    ) ;_ end of setq
  ) ;_ end of foreach
  (reverse res)
) ;_ end of defun
Да там вроде ничего особо сложного. Саму идею понял или стоит объяснить? Спрашиваю без сарказма, просто из меня учитель как из слона балерина.


Спасибо, а зачем мне начальные точки всех хвостов? =)

Да, если честно я код понял, прогнал его, потестировал. Круто ты оперируешь функциональным программироанием, но при этом массивы во все поля, как-то необычно.
Кажется что ты еще тот любитель common lisp'a =)

но я продублирую, может поправишь:
Код:
[Выделить все]
  (defun _kpblc-eval-closest-mleader (vla-polyline vla-mleader-list)
; запускаем функцию сортировки)
  (vl-sort (mapcar
; Выполнить функцию ниже для каждого элемента списка vla-mleader-list
             (function ; оптимизация
               (lambda (x / pt closest) ;анонимная функция
                 (setq pt      (vlax-safearray->list ; делаем из него список
                                 (vlax-variant-value; вытаскиеваем этот массив
                                   (vla-getleaderlinevertices x 0) ; получаем массив координат мультивыноски, их тут два
                                 ) ;_ end of vlax-variant-value
                               ) ;_ end of vlax-safearray->list
                       pt      (list (car pt) (cadr pt) (caddr pt)) ; получаем координаты выноски
                       closest (vlax-curve-getclosestpointto vla-polyline pt) ; находим ближайшую координату
                 ) ;_ end of setq ; создаем структуру с заданными данными
                 (setq x (list (cons "obj" x)
                               (cons "pt" pt)
                               (cons "closest" closest) ; ближайшая полилиния
                               (cons "dist" (distance pt closest))
                         ) ;_ end of list
                 ) ;_ end of setq
               ) ;_ end of lambda
             ) ;_ end of function
             vla-mleader-list
           ) ;_ end of mapcar
; сортируем по данной функции, каждый последующий с предыдущим, по признаку дистанции из нашей структуры
           (function (lambda (a b)
                       (< (cdr (assoc "dist" a)) (cdr (assoc "dist" b)))
                     ) ;_ end of LAMBDA
           ) ;_ end of function
  ) ;_ end of vl-sort
) ;_ end of defun
Для моей простой задачи такое универсальное решение рановато, учитывая, что я тут с точками не могу разобраться, как-то непривычно что-ли. Поэтому хочется пока все упрощать.
Тут загвоздка в том, что мне непонятно, почему мой код работает, и почему ближайшая выноска дает 0.0 дистанцию, а не 0.1 или 2.0, как буд-то какая-то фунция вычисляет от моей выноски до места касания с полилинией
gnuvse вне форума  
 
Непрочитано 26.10.2023, 22:18
1 | #4468
Кулик Алексей aka kpblc
Moderator

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


Пфффф... Попробую по шагам
Код:
[Выделить все]
   (defun _kpblc-eval-closest-mleader (vla-polyline vla-mleader-list)
; запускаем функцию сортировки)
  (vl-sort (mapcar
; Выполнить функцию ниже для каждого элемента списка vla-mleader-list
             (function ; оптимизация
               (lambda (x / pt closest) ;анонимная функция [+]
                 (setq pt      (vlax-safearray->list ; делаем из него список [+]
                                 (vlax-variant-value; вытаскиеваем этот массив
                                   (vla-getleaderlinevertices x 0) ; получаем массив координат мультивыноски, их тут два [kpblc: или больше]
                                 ) ;_ end of vlax-variant-value
                               ) ;_ end of vlax-safearray->list
                       pt      (list (car pt) (cadr pt) (caddr pt)) ; получаем координаты выноски [kpblc: на самом деле из списка выбираются первые три значения и засовываются в список]
                       closest (vlax-curve-getclosestpointto vla-polyline pt) ; находим ближайшую координату [kpblc: почти. Только не координату, а точку на полилинии, ближайшую к вычисленной чуть раньше]
                 ) ;_ end of setq ; создаем структуру с заданными данными
                 (setq x (list (cons "obj" x)
                               (cons "pt" pt)
                               (cons "closest" closest) ; ближайшая полилиния [kpblc: не полилиния, а ближайшая точка на полилинии]
                               (cons "dist" (distance pt closest)) ; [kpblc: дистанция от хвоста выноски до ближайшей точки. Понадобится потом для фильтрации и сортировки]
                         ) ;_ end of list
                 ) ;_ end of setq
               ) ;_ end of lambda
             ) ;_ end of function
             vla-mleader-list
           ) ;_ end of mapcar
; сортируем по данной функции, каждый последующий с предыдущим, по признаку дистанции из нашей структуры
           (function (lambda (a b) [kpblc: функция сортировки]
                       (< (cdr (assoc "dist" a)) (cdr (assoc "dist" b))) [kpblc: сортируем по параметру "dist"]
                     ) ;_ end of LAMBDA
           ) ;_ end of function
  ) ;_ end of vl-sort
) ;_ end of defun
Смотри, в mapcar вместо указателей на выноски формируется список из списков, внутри которых будет и начальная точка хвоста, и указатель на выноску, и расстояние - короче, все, чего душе захочется. mapcar вернет обновленный список, который через vl-sort уже сортируется. А вот уже через функцию сортировки мы сравниваем вычисленный ранее dist от хвоста до ближайшей точки на полилинии между двумя бывшими выносками. Чем это расстояние меньше, тем ближе к началу списка будет элемент. Соответственно самый первый будет обладать минимальным расстоянием от своего хвоста до полилинии. Его и можно брать и делать с ним (или с полилинией) уже все что угодно.
Offtop: ПыСы До пн я вряд ли буду в адеквате, других задач накидали мама не балуй.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.10.2023, 20:17
#4469
gnuvse


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


Алексей, можешь подсказать, а как ты нашел метод vla-getleaderlinevertices, если не погуглить напрямую, то нет этого метода в Leader, как такие вещи вообще стоит искать?

Последний раз редактировалось gnuvse, 31.10.2023 в 20:31.
gnuvse вне форума  
 
Непрочитано 31.10.2023, 20:38
#4470
Кулик Алексей aka kpblc
Moderator

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


Дык ета... (vlax-dump-object objec t)
Прикол именно в последнем параметре - он показывает еще и методы, доступные для объекта. Ну или VBA-справку надо раскуривать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.10.2023, 20:53
#4471
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Дык ета... (vlax-dump-object objec t)
Прикол именно в последнем параметре - он показывает еще и методы, доступные для объекта. Ну или VBA-справку надо раскуривать.
А что за последний параметр, у меня на выноску вот такое показывает, ничего похожего на координаты или название leader line vertices
Миниатюры
Нажмите на изображение для увеличения
Название: Выноска.png
Просмотров: 18
Размер:	23.9 Кб
ID:	259685  
gnuvse вне форума  
 
Непрочитано 31.10.2023, 20:58
1 | #4472
Кулик Алексей aka kpblc
Moderator

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


Ты эту строку в консоли VLIDE выполни )))
Код:
[Выделить все]
 _$ (setq obj (vlax-ename->vla-object (car (entsel "\nSelect mleader : "))))
#<VLA-OBJECT IAcadMLeader 00000203fc3bf758>
_$ (vlax-dump-Object obj t)
; IAcadMLeader: AutoCAD Multi-Leader Interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00007ff688c7d990>
;   ArrowheadBlock = ""
;   ArrowheadSize = 4.0
;   ArrowheadType = 0
;   BlockConnectionType = 0
;   BlockScale = 1.0
;   ContentBlockName = ""
;   ContentBlockType = 6
;   ContentType = 2
;   Document (RO) = #<VLA-OBJECT IAcadDocument 00000203fbc9c2e8>
;   DogLegged = -1
;   DoglegLength = 8.0
;   EntityTransparency = "ByLayer"
;   Handle (RO) = "295"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 00000203fbe5c368>
;   LandingGap = 2.0
;   Layer = "0"
;   LeaderCount (RO) = 1
;   LeaderLineColor = #<VLA-OBJECT IAcadAcCmColor 00000203fbeff390>
;   LeaderLinetype = "ByBlock"
;   LeaderLineWeight = -2
;   LeaderType = 1
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   ObjectID (RO) = 42
;   ObjectName (RO) = "AcDbMLeader"
;   OwnerID (RO) = 43
;   PlotStyleName = "ByLayer"
;   ScaleFactor = 1.0
;   StyleName = "Standard"
;   TextAttachmentDirection = 0
;   TextBackgroundFill = 0
;   TextBottomAttachmentType = 0
;   TextDirection = 5
;   TextFrameDisplay = 0
;   TextHeight = 4.0
;   TextJustify = 1
;   TextLeftAttachmentType = 1
;   TextLineSpacingDistance = 6.66667
;   TextLineSpacingFactor = 1.0
;   TextLineSpacingStyle = 1
;   TextRightAttachmentType = 1
;   TextRotation = 0.0
;   TextString = "qwerfgd"
;   TextStyleName = "Standard"
;   TextTopAttachmentType = 0
;   TextWidth = 0.0
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000203f0dcff60>
;   Visible = -1
; Methods supported:
;   AddLeader ()
;   AddLeaderLine (2)
;   AddLeaderLineEx (1)
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   GetBlockAttributeValue (1)
;   GetBoundingBox (2)
;   GetDoglegDirection (1)
;   GetExtensionDictionary ()
;   GetLeaderIndex (1)
;   GetLeaderLineIndexes (1)
;   GetLeaderLineVertices (1)
;   GetVertexCount (1)
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   RemoveLeader (1)
;   RemoveLeaderLine (1)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetBlockAttributeValue (2)
;   SetDoglegDirection (2)
;   SetLeaderLineVertices (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
T
_$ 
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.10.2023, 21:12
#4473
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ты эту строку в консоли VLIDE выполни )))
Код:
[Выделить все]
 _$ (setq obj (vlax-ename->vla-object (car (entsel "\nSelect mleader : "))))
#<VLA-OBJECT IAcadMLeader 00000203fc3bf758>
_$ (vlax-dump-Object obj t)
; IAcadMLeader: AutoCAD Multi-Leader Interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00007ff688c7d990>
;   ArrowheadBlock = ""
;   ArrowheadSize = 4.0
;   ArrowheadType = 0
;   BlockConnectionType = 0
;   BlockScale = 1.0
;   ContentBlockName = ""
;   ContentBlockType = 6
;   ContentType = 2
;   Document (RO) = #<VLA-OBJECT IAcadDocument 00000203fbc9c2e8>
;   DogLegged = -1
;   DoglegLength = 8.0
;   EntityTransparency = "ByLayer"
;   Handle (RO) = "295"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 00000203fbe5c368>
;   LandingGap = 2.0
;   Layer = "0"
;   LeaderCount (RO) = 1
;   LeaderLineColor = #<VLA-OBJECT IAcadAcCmColor 00000203fbeff390>
;   LeaderLinetype = "ByBlock"
;   LeaderLineWeight = -2
;   LeaderType = 1
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   ObjectID (RO) = 42
;   ObjectName (RO) = "AcDbMLeader"
;   OwnerID (RO) = 43
;   PlotStyleName = "ByLayer"
;   ScaleFactor = 1.0
;   StyleName = "Standard"
;   TextAttachmentDirection = 0
;   TextBackgroundFill = 0
;   TextBottomAttachmentType = 0
;   TextDirection = 5
;   TextFrameDisplay = 0
;   TextHeight = 4.0
;   TextJustify = 1
;   TextLeftAttachmentType = 1
;   TextLineSpacingDistance = 6.66667
;   TextLineSpacingFactor = 1.0
;   TextLineSpacingStyle = 1
;   TextRightAttachmentType = 1
;   TextRotation = 0.0
;   TextString = "qwerfgd"
;   TextStyleName = "Standard"
;   TextTopAttachmentType = 0
;   TextWidth = 0.0
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000203f0dcff60>
;   Visible = -1
; Methods supported:
;   AddLeader ()
;   AddLeaderLine (2)
;   AddLeaderLineEx (1)
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   GetBlockAttributeValue (1)
;   GetBoundingBox (2)
;   GetDoglegDirection (1)
;   GetExtensionDictionary ()
;   GetLeaderIndex (1)
;   GetLeaderLineIndexes (1)
;   GetLeaderLineVertices (1)
;   GetVertexCount (1)
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   RemoveLeader (1)
;   RemoveLeaderLine (1)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetBlockAttributeValue (2)
;   SetDoglegDirection (2)
;   SetLeaderLineVertices (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
T
_$ 


Ого, спасибо. Не разгадал твой ребус с красной t
gnuvse вне форума  
 
Непрочитано 31.10.2023, 21:49
#4474
Кулик Алексей aka kpblc
Moderator

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


Ну на крайняк действительно поставь VBA-енаблер и справку под него )) Тож пользительная штука.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.11.2023, 09:41
1 | #4475
koMon


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


gnuvse,
найди в своей языковой папке в "C:\Program Files\Common Files\Autodesk Shared\" справочник по ActiveX "acadauto.chm" и будет тебе счастье.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 01.11.2023, 10:47
#4476
gnuvse


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


Цитата:
Сообщение от koMon Посмотреть сообщение
gnuvse,
найди в своей языковой папке в "C:\Program Files\Common Files\Autodesk Shared\" справочник по ActiveX "acadauto.chm" и будет тебе счастье.
Спасибо.

Но я вчера пока искал метод для выноски, уже нашел эту доку онлайн
gnuvse вне форума  
 
Непрочитано 01.11.2023, 10:53
#4477
koMon


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


Нажмите на изображение для увеличения
Название: AXRG.jpg
Просмотров: 18
Размер:	446.1 Кб
ID:	259689
__________________
K Lisp
koMon вне форума  
 
Непрочитано 01.11.2023, 11:13
#4478
gnuvse


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


Цитата:
Сообщение от koMon Посмотреть сообщение
А я смотрел из объектной модели, там можно ткнуть на данные, я ткнул на leader и там ничего не было.
Но классно, я теперь буду в разных местах просматривать, осталось программировать научиться
gnuvse вне форума  
 
Непрочитано 01.11.2023, 15:49
#4479
gnuvse


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


Доброго дня.

У меня накопилось несколько вопросов и просьб, можете помочь?
Буду признателен.

1. Есть ли встроенная функция по декодированию списка-списков в список?
А то я сам накодировал вот такую программу, просто чертим pline по вставленным блокам. Сама функция list-of-lists-pt->list делает то, что я описал. А как ее переписать в стиле lisp?
Код:
[Выделить все]
 
; Предварительно считаем, что в наборе правильные данные
; собираем список всех точек из списка-списков точек. Было ((x y z)...(xn yn zn)) -> (x y z ... xn yn zn)
(defun list-of-lists-pt->list (vla-set-of-bl / ret-list)
	(setq list-of-lists-pt nil)
	(foreach vla-bl vla-set-of-bl
		(setq pt-bl (vlax-get vla-bl "insertionpoint"))
		(foreach c pt-bl
			(setq list-of-lists-pt (cons c list-of-lists-pt))
		)
	)
	(setq ret-list (reverse list-of-lists-pt))
	;return
	ret-list
)
; инициализация и заполнение массива 
(defun list-pt->safearray (list-pt)
	(setq len-list-pt (- (length list-pt) 1))
	(setq points (vlax-make-safearray vlax-vbDouble (cons '0 len-list-pt)))
	; return last eval
	(vlax-safearray-fill points list-pt)
)


(defun main()
	(setq acadObj (vlax-get-acad-object))
        (setq doc (vla-get-ActiveDocument acadObj))
	(setq modelSpace (vla-get-ModelSpace doc))

	(setq layer-bl "0")
	(setq eff-list-bl "test")
	
	
	(print "Select set of data")
	(setq list-of-vlas-bl (get-vlas-from-set-data layer-bl "INSERT")) ; (get-vlas-from-set-data layer-bl "INSERT") - самописная функция, просто делает ввод по нужным объектам и преобразовывает в vla весь набор
	(setq points (list-pt->safearray (list-of-lists-pt->list list-of-vlas-bl)))
	
	(vla-AddPolyline modelSpace points)
	

)

(main)

2. Как обработать такой случай работы моей программы выше(см. вложение)?
Какие я тут вижу проблемы:
а. Это определение этого места, то есть на пути от одной точки до другой стоит некое препятствие, может можно какой-то тестовый луч перед построением отправлять?
б. После локализации места нужно нам найти точку, и добавить ее для построения линии, то есть это должно осуществляться до вызова list-pt->safearray, чтобы потом передать правильную длину для vla-make-safearray
По-возможности, попробуйте мне описать словами, чтобы код я сам попробовал написать.



3. Порекомендуйте ссылки по изучению исходных кодов с форума, если возможно то не убер коды, а что-нибудь для новичка, чтобы развиваться. Наверняка вы уже на опыте можете отличить хороший и полезный код от посредственного, как мой например
Миниатюры
Нажмите на изображение для увеличения
Название: Пересечение.png
Просмотров: 11
Размер:	4.5 Кб
ID:	259711  

Последний раз редактировалось gnuvse, 01.11.2023 в 16:23.
gnuvse вне форума  
 
Непрочитано 01.11.2023, 16:27
1 | #4480
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 ; собираем список всех точек из списка-списков точек. Было ((x y z)...(xn yn zn)) -> (x y z ... xn yn zn)
	(defun list-of-lists-pt->list (point-list)
    (apply (function append) point-list))
И вторую я бы написал примерно так:
Код:
[Выделить все]
 (defun list-pt->safearray (list-pt) 
  (vlax-vlax-safearray-fill 
    (vlax-make-safearray 
      vlax-vbDouble
      (cons 0 (1- (length list-pt)))
      list-pt
    )
  )
)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46