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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите с лиспом "Слой в мультивыноску"

Помогите с лиспом "Слой в мультивыноску"

Ответ
Поиск в этой теме
Непрочитано 12.02.2022, 22:35 #1
Помогите с лиспом "Слой в мультивыноску"
koui
 
Регистрация: 24.01.2017
Сообщений: 126

Есть старенький Лисп, позволяющий превращать текст в мультивыноску.
Код:
[Выделить все]
 (defun c:mt2ml ( / oobj nobj nstrg pt1 pt2)
  (vl-load-com)
  (setq oobj (car (nentsel "\nSelect source text: ")))
  (setq nstrg (bg:FieldCode oobj)
         oobj (vlax-ename->vla-object oobj)
        )
   (initget 1)
   (setq pt1 (getpoint "\nSpecify leader arrowhead location :"))
   (initget 1)
   (setq pt2 (getpoint pt1 "\nSpecify leader landing location :"))
   (if command-s
     (command-s "_MLEADER" "_o" "_m" 2 "_x" "_h" "_none" pt1 "_none" pt2 "test" "")
     (command "_MLEADER" "_o" "_m" 2 "_x" "_h" "_none" pt1 "_none" pt2 "test" "")
     )
  (setq nobj (vlax-ename->vla-object (entlast)))
  (if (= (vlax-get-property nobj 'ObjectName) "AcDbMLeader")
    (progn
      (vlax-put-property nobj 'TextString nstrg)
      (vl-cmdf "_updatefield" "_all" "" "_regenall")
      )
    (exit)	   
    )
  (entdel (vlax-vla-object->ename oobj))
  (princ)
)
(defun bg:FieldCode (ent / foo elst xdict dict field str)
  ;; credits gile gc:FieldCode
  (defun ObjIdxStr (fld / pos)
  (setq pos (vl-string-search "ObjIdx " (cdr (assoc 2 fldId)) 0))
  (substr fld (1+ pos) (- (vl-string-search ">%" fld pos) pos))
  )
  (defun foo (field str / pos fldID objID)
    (setq pos 0)
    (if (setq pos (vl-string-search "\\_FldIdx " str pos))
      (while (setq pos (vl-string-search "\\_FldIdx " str pos))
        (setq fldId (entget (cdr (assoc 360 field)))
              field (vl-remove (assoc 360 field) field))
        (setq
              str   (strcat
                      (substr str 1 pos)
                      (if (setq objID (cdr (assoc 331 fldId)))
                        (vl-string-subst
                          ;;; (strcat "ObjId " (itoa (gc:EnameToObjectId objID))) ;;; VVA 2015-12-07
                          (strcat "ObjId " (bg:GetObjectIDString objID))
                          ;;; "ObjIdx" ;;; rem VVA 2015-12-07
                          (ObjIdxStr (cdr (assoc 2 fldId))) ;;; add VVA 2015-12-07
                          (cdr (assoc 2 fldId))
                        )
                        (foo fldId (cdr (assoc 2 fldId)))
                      )
                      (substr str (1+ (vl-string-search ">%" str pos)))
                    )
        )
      )
      str
    )
  )
  (setq elst (entget ent))
  (if (vlax-property-available-p (vlax-ename->vla-object ent) 'Textstring)
    (cond ((= (cdr(assoc 0 elst)) "MULTILEADER")
           (setq str (cdr(assoc 304 elst)))
           )
          ((and ;;; MTEXT ATTRIB ADD VVA 2011-20-27
             (member (cdr(assoc 0 elst)) '("ATTRIB"))
             (member '(101 . "Embedded Object") elst)
             )
           (setq str (apply 'strcat (append (bg:massoc 3 elst)(bg:massoc 1 (member '(101 . "Embedded Object") elst)))))
           )
          
          ((member (cdr(assoc 0 elst)) '("TEXT" "MTEXT" "ATTRIB"))
           (setq str (apply 'strcat (append (bg:massoc 3 elst)(bg:massoc 1 elst))))
           )
          (t (setq str (vla-get-TextString (vlax-ename->vla-object ent))))
    )
    )
  (if (and
	(member (cdr (assoc 0 elst)) '("ATTRIB" "MTEXT" "TEXT" "MULTILEADER"))
	(setq xdict (cdr (assoc 360 elst)))
	(setq dict (dictsearch xdict "ACAD_FIELD"))
	(setq field (dictsearch (cdr (assoc -1 dict)) "TEXT"))
      )
    (setq str (foo field (cdr (assoc 2 field))))
  )
    str
)
(defun bg:GetObjectIDString ( obj / *util* )
  (if (eq (type obj) 'ENAME)
    (setq obj (vlax-ename->vla-object obj))
    )
  (setq *util* (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object))))
  (if  (vlax-method-applicable-p *util* 'GetObjectIdString)
    (vla-GetObjectIdString *util* obj :vlax-false)
    (itoa (vla-get-ObjectId obj))
  )
 )
(defun bg:massoc (key alist)
  ;;;lib:massoc mip_lib.lsp
  (mapcar 'cdr (vl-remove-if-not (function (lambda (x) (= key (car x)))) alist)))
хотел его переделать в лисп, который из любого объекта бы извлекал имя слоя и превращал также в мультивыноску, но без удаления объекта.
ну, вторую часть (удаление) исправить смог. помогите с первой
Просмотров: 3590
 
Непрочитано 12.02.2022, 23:18
1 | #2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Как-то так
Код:
[Выделить все]
(defun c:l2ml ( / oobj nobj nstrg pt1 pt2)
  (vl-load-com)
  (setq oobj (car (nentsel "\nSelect source text: ")))

  (setq nstrg (strcat "%<\\AcObjProp Object(%<\\_ObjId "
		      (bg:GetObjectIDString oobj)
	              ">%).Layer>%"
	
  	      )
  )
  (setq oobj (vlax-ename->vla-object oobj))  
   (initget 1)
   (setq pt1 (getpoint "\nSpecify leader arrowhead location :"))
   (initget 1)
   (setq pt2 (getpoint pt1 "\nSpecify leader landing location :"))
   (if command-s
     (command-s "_MLEADER" "_o" "_m" 2 "_x" "_h" "_none" pt1 "_none" pt2 "test" "")
     (command "_MLEADER" "_o" "_m" 2 "_x" "_h" "_none" pt1 "_none" pt2 "test" "")
     )
  (setq nobj (vlax-ename->vla-object (entlast)))
  (if (= (vlax-get-property nobj 'ObjectName) "AcDbMLeader")
    (progn
      (vlax-put-property nobj 'TextString nstrg)
      (vl-cmdf "_updatefield" "_all" "" "_regenall")
      )
    (exit)	   
    )
  (entdel (vlax-vla-object->ename oobj))
  (princ)
)
Код поля скопипащен прямо из редактора полей, с заменой ObjectID на соответствующий выбранному объекту, а все остальное было написано до нас рукой мастера.
kp+ вне форума  
 
Непрочитано 12.02.2022, 23:38
#3
Кулик Алексей aka kpblc
Moderator

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


Вот командные методы для мультивыноски я бы не пользовал от слова совсем...
https://autolisp.ru/2015/01/21/mleader_create_order/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.02.2022, 00:28
#4
koui


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Как-то так
Код:
[Выделить все]
(defun c:l2ml ( / oobj nobj nstrg pt1 pt2)
  (vl-load-com)
  (setq oobj (car (nentsel "\nSelect source text: ")))

  (setq nstrg (strcat "%<\\AcObjProp Object(%<\\_ObjId "
		      (bg:GetObjectIDString oobj)
	              ">%).Layer>%"
	
  	      )
  )
  (setq oobj (vlax-ename->vla-object oobj))  
   (initget 1)
   (setq pt1 (getpoint "\nSpecify leader arrowhead location :"))
   (initget 1)
   (setq pt2 (getpoint pt1 "\nSpecify leader landing location :"))
   (if command-s
     (command-s "_MLEADER" "_o" "_m" 2 "_x" "_h" "_none" pt1 "_none" pt2 "test" "")
     (command "_MLEADER" "_o" "_m" 2 "_x" "_h" "_none" pt1 "_none" pt2 "test" "")
     )
  (setq nobj (vlax-ename->vla-object (entlast)))
  (if (= (vlax-get-property nobj 'ObjectName) "AcDbMLeader")
    (progn
      (vlax-put-property nobj 'TextString nstrg)
      (vl-cmdf "_updatefield" "_all" "" "_regenall")
      )
    (exit)	   
    )
  (entdel (vlax-vla-object->ename oobj))
  (princ)
)
Код поля скопипащен прямо из редактора полей, с заменой ObjectID на соответствующий выбранному объекту, а все остальное было написано до нас рукой мастера.
здорово!
ну, строку (entdel (vlax-vla-object->ename oobj)) я удалил ))))
а можно возвращать не полем, а текстом? заметил, что когда на чертеже много полей чаще случаются вылеты из программы.
koui вне форума  
 
Непрочитано 13.02.2022, 00:39
1 | 1 #5
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Цитата:
Сообщение от koui Посмотреть сообщение
а можно возвращать не полем, а текстом?
Можно. Но ведь вычисляемые поля - это вроде бы хорошо... А чтоб не глючило и не тормозило, уменьшить значение Fieldeval, чтобы поля обновлялись только при открытии, сохранении и печати.
Иначе надо следить, чтоб объекты никуда не делись со своих слоев.
Код:
[Выделить все]
  (setq oobj (vlax-ename->vla-object oobj))
  (setq nstrg (vla-get-layer oobj))
Offtop:
- Можно кофе?
- Да, с молоком.
- А можно мне без молока, пожалуйста?
- Такого в меню нет. Только по спецзаказу, по двойной цене

Последний раз редактировалось kp+, 13.02.2022 в 00:46.
kp+ вне форума  
 
Автор темы   Непрочитано 14.02.2022, 09:24
#6
koui


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Можно. Но ведь вычисляемые поля - это вроде бы хорошо... А чтоб не глючило и не тормозило, уменьшить значение Fieldeval, чтобы поля обновлялись только при открытии, сохранении и печати.
Иначе надо следить, чтоб объекты никуда не делись со своих слоев.
Код:
[Выделить все]
  (setq oobj (vlax-ename->vla-object oobj))
  (setq nstrg (vla-get-layer oobj))
Offtop:
- Можно кофе?
- Да, с молоком.
- А можно мне без молока, пожалуйста?
- Такого в меню нет. Только по спецзаказу, по двойной цене
большое спасибо, в т.ч. и за совет. всё же остановлюсь пока на полях, но сам лисп получился для моих целей замечательный! теперь можно делать мультивыноску из любой информации, слегка меняя код, а результат оформлять хоть полем, хоть текстом.
koui вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите с лиспом "Слой в мультивыноску"

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Товарищи! помогите с лиспом САПР LISP 27 11.02.2019 09:00
Помогите с лиспом PTLB alivstar LISP 2 27.06.2013 16:24
Помогите лиспом?? Gri05-1 LISP 7 19.04.2013 11:19
помогите с лиспом !!!!!!!! САПР LISP 44 05.04.2007 17:04
Помогите с лиспом GarryPop LISP 6 04.01.2007 09:19