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

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

Как подписать линию именем слоя ?

Ответ
Поиск в этой теме
Непрочитано 15.07.2011, 10:06 #1
Как подписать линию именем слоя ?
Mixon2010
 
инженер проектировщик
 
Москва
Регистрация: 27.09.2010
Сообщений: 47

Можно ли сделать такой Lisp, чтобы он подписал выбранный объект на чертеже именем слоя в котором он начерчен ? Спасибо
Просмотров: 3482
 
Непрочитано 15.07.2011, 10:26
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Каким образом подписал? Текст рядом с линией поместил? Если так, то можно.
Do$ вне форума  
 
Непрочитано 15.07.2011, 10:27
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Можно - но как написал так и получай - исправлять сам будешь:
Код:
[Выделить все]
 (defun c:podpis()
  ((lambda (ents)
     (if ents
         (entmakex (list (cons 0 "text")
                         (cons 10 (cadr ents))
                         (cons 1 (cdr (assoc 8 (entget (car ents)))))
                         (cons 40 2.5)))
         (princ "\nПромахнулись...")))
   (entsel))
   (princ))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.07.2011, 10:38
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Offtop: Ну вот... А поговорить?
Do$ вне форума  
 
Непрочитано 15.07.2011, 11:33
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Тоже только полем

Код:
[Выделить все]
 (defun c:podpis ()
  (vl-load-com)
  ((lambda (ents)
     (if ents
       (vl-cmdf "_updatefield"
                (entmakex
                  (list (cons 0 "text")
                        (cons 10 (cadr ents))
                        (cons 1
                              (strcat
                                "%<\\AcObjProp Object(%<\\_ObjId "
                                (vl-princ-to-string
                                  (Get-ObjectID-x86-x64
                                    (vlax-ename->vla-object (car ents))
                                  ) ;_ end of Get-ObjectID-x86-x64
                                ) ;_ end of vl-princ-to-string
                                ">%).Layer \\f \"%tc3\">%"
                              ) ;_ end of strcat
                        ) ;_ end of cons
                        (cons 40 2.5)
                  ) ;_ end of list
                ) ;_ end of entmakex
                ""
       ) ;_ end of vl-cmdf
       (princ "\nПромахнулись...")
     ) ;_ end of if
   ) ;_ end of lambda
    (entsel)
  )
  (princ)
) ;_ end of defun
;;--------------------------------------------------------
;; Функция получает строковое представление ObjectID
;; вне зависимости от того AutoCAD x86 или x64
;; Источник: "Field and objectid problem"
;;http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/Field-and-objectid-problem/m-p/2478592/highlight/true#M276818
;; http://forum.dwg.ru/showthread.php?t=51822
;;--------------------------------------------------------
(defun Get-ObjectID-x86-x64 (obj / util)
  (setq util (vla-get-utility
               (vla-get-activedocument (vlax-get-acad-object))
             ) ;_ end of vla-get-Utility
  ) ;_ end of setq
  (if (= (type obj) 'ENAME)
    (setq obj (vlax-ename->vla-object obj))
  ) ;_ end of if
  (if (= (type obj) 'VLA-OBJECT)
    (if (> (vl-string-search "x64" (getvar "platform")) 0)
      (vlax-invoke-method
        util
        "GetObjectIdString"
        obj
        :vlax-false
      ) ;_ end of vlax-invoke-method
      (rtos (vla-get-objectid obj) 2 0)
    ) ;_ end of if
  ) ;_ end of if
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 15.07.2011 в 19:35.
VVA вне форума  
 
Непрочитано 15.07.2011, 11:38
#6
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 427
<phrase 1=


Или вот так ещё можно:
Код:
[Выделить все]
 ;;--------------------------------------------------------
;; Функция получает строковое представление ObjectID
;; вне зависимости от того AutoCAD x86 или x64
;; Источник: https://discussion.autodesk.com/forums/message.jspa?messageID=6172961
;;--------------------------------------------------------
(defun get-objectid-x86-x64 (obj / util)
  (setq util (vla-get-utility (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (type obj) 'ename)
    (setq obj (vlax-ename->vla-object obj))
    ) ;_ end of if
  (if (= (type obj) 'vla-object)
    (if (> (vl-string-search "x64" (getvar "platform")) 0)
      (vlax-invoke-method util "GetObjectIdString" obj :vlax-false)
      (rtos (vla-get-objectid obj) 2 0)
      ) ;_ end of if
    ) ;_ end of if
  ) ;_ end of defun

(vl-load-com)

(defun c:insf (/ adoc ent pt)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (= (type
                (setq
                  ent (vl-catch-all-apply
                        (function
                          (lambda ()
                            (vlax-ename->vla-object
                              (car
                                (entsel "\nУкажите отрезок, полилинию или сплайн <Отмена> : ")
                                ) ;_ end of car
                              ) ;_ end of vlax-ename->vla-object
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
                ) ;_ end of type
              'vla-object
              ) ;_ end of =
           (vlax-property-available-p ent 'layer)
           (= (type (setq pt (vl-catch-all-apply
                               (function
                                 (lambda ()
                                   (getpoint "\nУкажите точку для простановки поля <Отмена> : ")
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           pt
           ) ;_ end of and
    (vla-addtext
      (vla-objectidtoobject
        adoc
        (vla-get-ownerid ent)
        ) ;_ end of vla-ObjectIDToObject
      (strcat "%<\\AcObjProp Object(%<\\_ObjId "
              (vl-princ-to-string (get-objectid-x86-x64 ent))
              ">%).Layer \\f \"%lu6\">%"
              ) ;_ end of strcat
      (vlax-3d-point pt)
      300
      ) ;_ end of vla-addtext
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
код не мой, я просто разместил объяву )))
Правда, подписывает не любой объект, а только линии, полилинии и сплайны, но зато делает это с помощью поля. При смене имени слоя не забывайте регенерировать.
Alexeipost вне форума  
 
Автор темы   Непрочитано 15.07.2011, 11:58
#7
Mixon2010

инженер проектировщик
 
Регистрация: 27.09.2010
Москва
Сообщений: 47


Всем большое спасибо !!! . Все работает здорово, именно то что мне надо !!! вот бы самому так научиться ))) все некогда...

Последний раз редактировалось Mixon2010, 15.07.2011 в 12:14.
Mixon2010 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как подписать линию именем слоя ?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не проходит теплорасчет? Suom Конструкции зданий и сооружений 15 10.08.2011 17:22
Слои в автокаде. при добавлении нового слоя не могу изменить имя и свойства слоя oleole AutoCAD 6 02.11.2010 23:28
Перебор блоков в модели и создание надписи с именем слоя Sanmart Программирование 2 16.04.2010 09:27