Autolisp. Вставка формулы в ПОЛЕ текста
Реклама i
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Вставка формулы в ПОЛЕ текста

Autolisp. Вставка формулы в ПОЛЕ текста

Ответ
Поиск в этой теме
Непрочитано 23.03.2015, 10:04 #1
Autolisp. Вставка формулы в ПОЛЕ текста
Isuma
 
конструктор
 
Санкт-Петербург
Регистрация: 29.09.2008
Сообщений: 159

Подскажите, пожалуйста, как составить алгоритм написания Lisp (и какие функции нужно использовать), для того, чтобы он создавал объект с текстом, в который было бы вставлено ПОЛЕ. А в этом поле была бы написана формула, которая суммирует содержимое все выделенных пользователем текстовых объектов (с числами). Грубо говоря, аналог экселевского SUM. Главная задача состоит в том, чтобы не тыкать по каждому объекту, который нужно суммировать, а выбрать все разом и назначить тип "Содержимое".
Прикладываю файл с результатом, который должен получиться.

----- добавлено через ~8 ч. -----
Посмотрел тему: http://autolisp.ru/2010/05/30/field-proceed-2/
где описано программное создание ПОЛЯ. Вот только этот код, который написал товарищ Кулик Алексей aka kpblc:
Код:
[Выделить все]
 (vl-load-com)

(defun c:insfld (/ 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 'length)
           (= (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))
              ">%).Length \\f \"%lu6\">%"
              ) ;_ end of strcat
      (vlax-3d-point pt)
      2.5
      ) ;_ end of vla-addtext
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
выдаёт ошибку no function definition: GET-OBJECTID-X86-X64. Это, видимо, связано с тем, что должна быть использована vla-get-objectid.
Но, тем не менее, длина не передаётся в Field. То есть, получаемое значение - ####.
Да простит меня за плагиат Кулик Алексей aka kpblc, я изменил length на textstring.
Таким образом, код для поля выглядит как: %<\AcObjProp Object(%<\_ObjId 43>%).textstring>%
Однако, значение содержимого текста всё равно не передаётся. То есть, ID этого объекта при использовании Лисп не совпадает с id объекта, которое берётся при обычной вставке Поля средствами Автокада.

Вложения
Тип файла: dwg
DWG 2010
Спецификация металлопроката.dwg (166.7 Кб, 1220 просмотров)

__________________
Идеал оптимизации - это когда жмёшь куда попало, а получаешь то, что нужно.

Последний раз редактировалось Isuma, 23.03.2015 в 18:01. Причина: Копаюсь
Просмотров: 4369
 
Непрочитано 25.03.2015, 16:55
1 | #2
VVA

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


Есть еще такой вариант (реакторы)
А так же посмотреть здесь LISP. Вставка в таблицу поля, соотвествующего площади примитива
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.03.2015, 17:15
#3
gomer

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


и вирусы
gomer вне форума  
 
Непрочитано 25.03.2015, 18:29
#4
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


100% Дело в разрядности вашей системы (AutoCADа). Так что нужно копать именно в этом направлении.. Так что функция "vla-get-objectid", будет верна только для 32х разрядных систем. Там ID объектам присваивались по порядку. А в 64х разрядных версиях формула для поля выглядит примерно так: "%<\AcObjProp Object(%<\_ObjId 8796087797184>%).TextString>%", т.е. ID - очень многозначное число, не важно сколько примитивов в модели. Так что нужна функция "GET-OBJECTID-X86-X64", о ней вам подробнее (надеюсь) расскажет Алексей..
art_rrc вне форума  
 
Непрочитано 25.03.2015, 20:21
#5
Кулик Алексей aka kpblc
Moderator

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


Во-первых, код этой функции был прямо показан в статье (да еще и ссылка дана на исходник http://forum.dwg.ru/showpost.php?p=566244&postcount=8). Эту функцию просто рядом в lsp прописать и все.
Во-вторых, чуть ниже приводится ссылка на http://autolisp.ru/2011/07/07/x32x64objectid/ и там же - исходники альтернативных функций (которые достаточно просто переименовать). Скажу честно - сейчас рассказывать все подряд у меня нет никакой возможности.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.03.2015, 21:52
#6
VVA

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


Ссылка на оригинал Get-ObjectID-x86-x64
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.03.2015, 14:12
#7
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


откуда у текстового объекта скажите мне свойство length ?
kakt00z вне форума  
 
Непрочитано 28.03.2015, 14:40
#8
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от kakt00z Посмотреть сообщение
откуда у текстового объекта скажите мне свойство length ?
Чего? Ты на формулу поля посмотри - там еще и не такое встретишь
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Вставка формулы в ПОЛЕ текста

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Курсор в конец редактируемого текста? zlobandr AutoCAD 15 13.05.2008 16:41
Вставка содержимого ячейки таблицы в поле в mtext Witalij AutoCAD 11 22.11.2007 14:15
Изменение форматированного текста посредством lisp Tramp LISP 4 03.03.2006 11:28