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

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

престал работать lisp PTLB 2011 автокаде

Ответ
Поиск в этой теме
Непрочитано 10.05.2010, 20:00 #1
престал работать lisp PTLB 2011 автокаде
alivstar
 
Регистрация: 09.05.2010
Сообщений: 12

Здравствуйте! проблема такая: пользовался следующим Lisp-ом:

Код:
[Выделить все]
;  Команда: PTLB
;  ^C^C(if (not C:PTLB) (load "ptlb"));PTLB
(defun C:PTLB ( / en cmdname fld txt fc tblset tblobj row col pt
                 whatAcadVer tstyle what en1)

 (vl-load-com)

		(princ "\nВыберите полилинию, круг, сплайн, эллипс или дугу")
         (and
           (setq tblset (ssget "_:S:E" (if (= what "Area") '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE"))
                                                           '((0 . "LINE,*POLYLINE,ARC,CIRCLE")))
                                         ))
           (setq en (ssname tblset 0))
         )
		
		(setq fld (strcat
                "%<\\AcObjProp Object(%<\\_ObjId "
                (vl-princ-to-string
                  (vla-get-objectid (vlax-ename->vla-object en))
                  ) ;_ vl-princ-to-string
                ">%).Length  \\f \"L=%lu2%pr1%ps[,м]%ct8[0.00118]\">%"
                ) ;_ strcat
        ) ;_ setq
	
		(setvar "cmdecho" 0)
		
		(SETQ en1 (ENTGET (CAR (ENTSEL "Текст"))))
		(SETQ en1 (SUBST (CONS 1 fld)(ASSOC 1 en1) en1))
		(ENTMOD en1)
  )
  (princ)
  )
после выбора текста текст имеет вид #### после регенерации модели в прошлых версиях становился таким как надо т.е L=xxм, но вот в новой версии автокада ни чего не происходит. Я в лиспе не шарю, так что прошу помощи у более продвинутых граждан с решением этой проблемы.

Последний раз редактировалось Кулик Алексей aka kpblc, 11.05.2010 в 00:19.
Просмотров: 7548
 
Непрочитано 10.05.2010, 22:12
#2
VVA

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


В 2011 не проверял, негде. Изменения выделил красным.
Внесены изменения в соответсвии с #8
Код:
[Выделить все]
; Команда: PTLB
; ^C^C(if (not C:PTLB) (load "ptlb"));PTLB
;;; http://forum.dwg.ru/showthread.php?t=51822

(defun C:PTLB ( / en cmdname fld txt fc tblset tblobj row col pt
whatAcadVer tstyle what en1)
 
(vl-load-com)

(princ "\nВыберите полилинию, круг, сплайн, эллипс или дугу")
(and
(setq tblset (ssget "_:S:E" (if (= what "Area") '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE"))
'((0 . "LINE,*POLYLINE,ARC,CIRCLE")))
))
(setq en (ssname tblset 0))
)

(setq fld (strcat
"%<\\AcObjProp Object(%<\\_ObjId "
(vl-princ-to-string (Get-ObjectID-x86-x64 en)) ;_ vl-princ-to-string
">%).Length \\f \"L=%lu2%pr1%ps[,м]%ct8[0.00118]\">%"
) ;_ strcat
) ;_ setq

(setvar "cmdecho" 0)
(SETQ en1 (ENTGET (CAR (ENTSEL "Текст"))))
(SETQ en1 (SUBST (CONS 1 fld)(ASSOC 1 en1) en1))
(ENTMOD en1)
(command "_.updatefield" (cdr(assoc -1 en1)) "")
(princ)
)
;;--------------------------------------------------------
;; Функция получает строковое представление ObjectID
;; вне зависимости от того AutoCAD x86 или x64
;; Источник: https://discussion.autodesk.com/forums/message.jspa?messageID=6172961
;; 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))))
  (if (= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj)))
  (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)
     )
  )
)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 12.05.2010 в 09:58. Причина: Внесены изменения в соответсвии с #8
VVA вне форума  
 
Автор темы   Непрочитано 10.05.2010, 22:30
#3
alivstar


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


Не помогло( такуюже тему заметил на некоторых компьютерах в 2010-ом, может они с сервиспаком были..
alivstar вне форума  
 
Непрочитано 11.05.2010, 00:39
#4
Кулик Алексей aka kpblc
Moderator

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


Боюсь, что здесь решающую роль сыграет разрядность и версия AutoCAD'a. У меня для однотипных объектов значения кодов полей начинаются:
для 2010, 64-бит: "%<\\AcObjProp Object(%<\\_ObjId 8796087802000>%).
для 2011, 64-бит: "%<\\AcObjProp.16.2 Object(%<\\_ObjId 8796083605616>%).

Откуда там взялась такая форма записи - не спрашивай, не знаю.

P.S. Не очень понял, откуда в тексте программы проверка (if (= what "Area") - в представленном варианте переменная what всегда nil. Да и коэффициент перевода странноватый. Но это уже мелочи.
P.P.S. Попробовал на 2011 64-бит написать похожую программу, но поле создаваться отказалось
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.05.2010, 02:58
#5
alivstar


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


Коэффициент такой нужен был, а про остальное ни чего ответить не могу, разве только что этот лисп это кусок другого лиспа взятого из этой темы http://forum.dwg.ru/archive/index.php/t-14528-p-4.html
alivstar вне форума  
 
Непрочитано 11.05.2010, 11:40
#6
VVA

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не очень понял, откуда в тексте программы проверка (if (= what "Area")
Отредактированный под свои нужды один из лиспов этой темы
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 11.05.2010, 17:02
#7
alivstar


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


Походу дела вся проблема в разрядности, везде где пробовал на х32 все работает.
alivstar вне форума  
 
Непрочитано 11.05.2010, 18:25
4 | #8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Код:
[Выделить все]
;;--------------------------------------------------------
;; Функция получает строковое представление 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)))
  (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)
     )
  )
)
Александр Ривилис вне форума  
 
Непрочитано 12.05.2010, 10:00
#9
VVA

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


Спасибо Александр.
alivstar, Внес изменения в #2. Тестируй и отпишись
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 13.05.2010 в 10:16. Причина: орфография
VVA вне форума  
 
Автор темы   Непрочитано 13.05.2010, 01:51
#10
alivstar


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


Отлично! Заработало! Спасибо Вам Огромное!))
alivstar вне форума  
 
Автор темы   Непрочитано 07.06.2010, 17:45
#11
alivstar


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


Уваожаемые програмисты! Появилась потребность длинну вставлять в ячейку таблицы, в этом коде эта функция вроде как реализована:
Код:
[Выделить все]
;  Команда: PTLB
;  Эта команда позволяет вставить в указанную точку рисунка или указанную ячейку таблицы
;  текст с полем (FIELD), содержащее значение площади или длины построенного или выбранного контура.
;  Точность округления и масштабный коэффициент настраиваются через опцию Установки
;  Так как это поле связано с конкретным объектом, то при изменении
;  объекта поле пересчитывается (необходимо обновление поля)
;  Код можно сохранить в файле ptlb.lsp
;  Возможный макрос для кнопки или пункта меню:
;  ^C^C(if (not C:PTLB) (load "ptlb"));PTLB;
;; Вариант макроса для задания м2
;; ^C^C(if (not C:PTLB) (load "ptlb"));PTLB;_L;_S;1;0.001;2;5;;м2;
;;Где
;; _L - считать длинну (_A - площадь)
;; _S - установки
;; 1 - линейный масштабный коэффициент
;; 0.001 — площадной масштабный коэффициент
;; 2 — точность округления
;; 5 — высота текста
;; префикса нет
;; м2 - суффикс
(defun C:PTLB ( / en cmdname fld txt fc tblset tblobj row col pt
                 whatAcadVer tstyle what)
;;;Ф-ция возвращает версию Автокада ввиде 2004 2005 2006 2007 2008 2009
(defun whatAcadVer ( / Aver)
(setq Aver (atof (substr (getvar "ACADVER") 1 4)))
(cond
((= Aver 17.2) 2009)
((= Aver 17.1) 2008)
((= Aver 17.0) 2007)
((= Aver 16.2) 2006)    
((= Aver 16.1) 2005)
((= Aver 16.0) 2004)
((= Aver 15.06) 2002)
(t 0)
)
)  (vl-load-com)
  (or *SCALEL* (setq *SCALEL* 1))
  (or *SCALEA* (setq *SCALEA* 1))
  (or *PREC* (setq *PREC* 2))
  (or *TEXTSIZE* (setq *TEXTSIZE* (getvar "TEXTSIZE")))
  (or *SUFF* (setq *SUFF* ""))(or *PREF* (setq *PREF* ""))
  (setq *SUFF* (vl-princ-to-string *SUFF*))
  (setq *PREF* (vl-princ-to-string *PREF*))
  (and
    (or ;_ > Проверяем версию
      (> (whatAcadVer) 2005)
      (alert "\nНужен Автокад версии 2006 и выше")
      ) ;_ < Проверяем версию
    (or (initget "Length Area Длина Площадь _Length Area Length Area") t)
    (if (null (setq what (getkword "\nЧто будем считать [Длина/Площадь] <Длина> :")))
      (setq what "Length") t)
      (princ "\nТекущий масштаб: линейный = ")(princ *SCALEL*)(princ " площадной = ")(princ *SCALEA*)
      (princ " Текущая точность округления = ")(princ *PREC*)
      (princ " Высота текста = ")(princ *TEXTSIZE*)
      (princ " Префикс= ")(princ *PREF*)(princ " Суффикс= ")(princ *SUFF*)
    (or
      (initget "Polyline Setting sElect Полилиния Установки Выбор _Polyline Setting sElect Polyline Setting sElect")
      t
      )
    (or ;_ > Запрашиваем что рисовать + опции
    (while (= (setq cmdname (getkword (strcat (if (= what "Area") "\n<Площадь> " "\n<Длина> ")
           "Выберите или нарисуйте [Полилиния/Установки/Выбор] <Выбор>: ")))
              "Setting")
      (princ "\nНовый линейный масштабный коэффициент <")(princ *SCALEL*)(princ "> : ")
      (initget 6)
      (if (setq en (getdist))(setq *SCALEL* en))
      (princ "\nНовый площадной масштабный коэффициент <")(princ *SCALEA*)(princ "> : ")
      (initget 6)
      (if (setq en (getdist))(setq *SCALEA* en))
      (princ "\nТочность округления <")(princ *PREC*)(princ "> : ")
      (initget 4)
      (if (setq en (getint))(setq *PREC* en))
      (princ "\nВысота текста <")(princ *TEXTSIZE*)(princ "> : ")
      (initget 6)
      (if (setq en (getdist))(setq *TEXTSIZE* en))
      (princ "\nПрефикс (пробел - очистить) <")(princ *PREF*)(princ "> : ")
      (setq en (getstring t))(if (= en "")(setq en *PREF*))
      (if (= en " ")(setq en ""))
      (if (= (substr (vl-string-left-trim "\/" en) 1 2) "U+")
      (setq en (strcat "\\" (vl-string-left-trim "\/" en))))(setq *PREF* en)
      (princ "\nСуффикс (пробел - очистить) <")(princ *SUFF*)(princ "> : ")
      (setq en (getstring t))(if (= en "")(setq en *SUFF*))
      (if (= en " ")(setq en ""))
      (if (= (substr (vl-string-left-trim "\/" en) 1 2) "U+")
      (setq en (strcat "\\" (vl-string-left-trim "\/" en))))(setq *SUFF* en)
      (initget "Polyline Setting sElect Полилиния Установки Выбор _Polyline Setting sElect Polyline Setting sElect")
      )
    t
    ) ;_ < Запрашиваем что рисовать + опции
  (cond
    ((= cmdname "Polyline")(setvar "CMDECHO" 1)(command "_.PLINE")
     (while (> (getvar "CMDACTIVE") 0)(command pause))
     (setq en (entlast))
     )
    ((or (null cmdname)(= cmdname "sElect"))
         (princ "\nВыберите полилинию, круг, сплайн, эллипс или дугу")
         (and
           (setq tblset (ssget "_:S:E" (if (= what "Area") '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE"))
                                                           '((0 . "LINE,*POLYLINE,ARC,CIRCLE")))
                                         ))
           (setq en (ssname tblset 0))
           )
     )
    (t nil)
    )
  ;_ Формируем поле
  (cond
    ((= what "Area")
     (setq fld (strcat "%<\\AcObjProp Object(%<\\_ObjId "
             (vl-princ-to-string(vla-get-objectid (vlax-ename->vla-object en)))
                ">%).Area \\f \"%lu2%ps["*PREF* "," *SUFF*
                "]%pr"(itoa *PREC*) "%ct8["(vl-princ-to-string *SCALEA*)"]\">%"
                ) ;_ strcat
          ) ;_ setq
     )
    ((and (= what "Length")
          (= (cdr(assoc 0 (entget en))) "CIRCLE")
          )
     (setq fld (strcat
                "%<\\AcObjProp Object(%<\\_ObjId "
                (vl-princ-to-string
                  (vla-get-objectid (vlax-ename->vla-object en))
                  ) ;_ vl-princ-to-string
                ">%).Circumference \\f \"%lu2%pr"(itoa *PREC*) "%ct8["(vl-princ-to-string *SCALEL*)"]\">%"
                ) ;_ strcat
          ) ;_ setq
     )
    ((and (= what "Length")
          (= (cdr(assoc 0 (entget en))) "ARC")
          )
     (setq fld (strcat
                "%<\\AcObjProp Object(%<\\_ObjId "
                (vl-princ-to-string
                  (vla-get-objectid (vlax-ename->vla-object en))
                  ) ;_ vl-princ-to-string
                ">%).ArcLength \\f \"%lu2%pr"(itoa *PREC*) "%ct8["(vl-princ-to-string *SCALEL*)"]\">%"
                ) ;_ strcat
          ) ;_ setq
     )
    ((and (= what "Length")
          (vlax-property-available-p (vlax-ename->vla-object en) "Length")
          )
     (setq fld (strcat
                "%<\\AcObjProp Object(%<\\_ObjId "
                (vl-princ-to-string
                  (vla-get-objectid (vlax-ename->vla-object en))
                  ) ;_ vl-princ-to-string
                ">%).Length \\f \"%lu2%pr"(itoa *PREC*) "%ct8["(vl-princ-to-string *SCALEL*)"]\">%"
                ) ;_ strcat
          ) ;_ setq
     )
    (t (setq fld "Неизвестное свойство"))
    )
(setvar "cmdecho" 0)
(setq tstyle (getvar "TEXTSTYLE")) ;_Стиль текста Стиль должен существовать
    ;_ Создаем текст
(if (= (cdr (assoc 40 (tblsearch "STYLE" tstyle))) 0.0)
     ;; нулевая высота текста
   (vl-cmdf "_.-TEXT" "_S" tstyle "_none" '(0 0 0) *TEXTSIZE* 0 fld)
   (vl-cmdf "_.-TEXT" "_S" tstyle "_none" '(0 0 0) 0 fld)
   ) ;_ end of if
    (setq txt (entlast))
  ;_ Копируем в буфер и обратно
  (vl-cmdf "_updatefield" txt "")
  (princ "\n Укажите точку вставки текста или ячейку таблицы:")
  (vl-cmdf "_.copybase" (trans '(0 0 0) 0 1) txt "" "_.erase" txt "" "_.pasteclip" "_none" pause)
  ;_ В txt примитив текста в pt точка вставки  
  (setq txt (entlast) pt (getvar "LASTPOINT"))
  (or
    (and ;_Проверяем, попала ли точка в ячейку таблицы
      (setq  tblobj nil tblset (ssget "_X" '((0 . "ACAD_TABLE"))))
      (setq lst (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex tblset)))))
      (mapcar '(lambda (x)
           (or tblobj
               (and
                 (= :vlax-true (vla-HitTest x
                               (vlax-3d-point (trans pt 1 0))
                               (vlax-3d-point (trans (getvar "VIEWDIR") 1 0))
                               'row 'col))
                 (setq tblobj x)
                 )
               )
           )
        lst)
      tblobj row col
      (or (vla-SetText tblobj row col fld) t)
      (entdel txt)
      )
    (and ;_Не попала, рисуем текст с полем
      (setq txt (vlax-ename->vla-object txt))
      (vlax-write-enabled-p txt)
      (vlax-method-applicable-p txt 'FieldCode) ;_есть метод FieldCode
      (vlax-property-available-p txt 'TextString)
      (vlax-put txt 'TextString fld)
      )
    )
  )
  (princ)
  )
помогите пожалуйста её вставить в мой лисп.

Последний раз редактировалось Кулик Алексей aka kpblc, 07.06.2010 в 20:17.
alivstar вне форума  
 
Непрочитано 07.06.2010, 20:05
#12
VVA

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


alivstar, См пост #3 (обновил PTLB),а заодно и остальные лиспы
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 07.06.2010 в 20:13.
VVA вне форума  
 
Автор темы   Непрочитано 08.06.2010, 02:05
#13
alivstar


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


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

Последний раз редактировалось alivstar, 08.06.2010 в 02:15.
alivstar вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > престал работать lisp PTLB 2011 автокаде



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работать с Excel из LISP kolobrod LISP 32 08.12.2022 10:34
Как работать в Автокаде Ufa AutoCAD 39 26.11.2009 14:11
Lisp (оценивающий производительность в автокаде) dextron3 LISP 6 26.07.2009 11:12
Клавиша Del в автокаде перестает работать :(( Barbarian AutoCAD 6 27.06.2008 15:01