Re: Связь графических объектов и текста

Теперь бы в другой программе вместо указания точки вставки указать ячейку таблицы? Или в этой программе добавить выбор: или точка, или ячейка таблицы. Не знаю, как лучше. Но ясно, что такая программа будет работать только с 2006-го AutoCAD'а.

Re: Связь графических объектов и текста

> Владимир Громов
А почему вы закоментарили две строки? Хотели как-то еще учесть стиль и слой?
Какое-то чувство подсказывает, что могут посыпаться вопросы: как изменить стиль, выравнивание, высоту текста. Кому надо, пусть раскоментаривает и пишет что нужно.

Я бы отправил эту программу в раздел "Готовые программы"

Доделаем вторую, можно и отправить, только я пока непонимаю, для чего или где ее можно использовать.

Re: Связь графических объектов и текста

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

Re: Связь графических объектов и текста

> VVA
Хочу отметить еще, что поле, присоединенное к полилинии, правильно отображает изменения при редактировании полилинии вашими программами для работы с полилинией.

Re: Связь графических объектов и текста

Можно и в электрике применить, об автоматическом подсчете кабеля мечтают все электрики

Re: Связь графических объектов и текста

Второе приближение.
- Масштаб, точность округдения, высота текста
  задается в настройке.
- Добавлена проверка версии Автокада.
- Можно рисовать, можно выбирать объекты
- Когда текст болтается на курсоре, если ткнуть
  в ячейку таблицы, то текст вставится в
  таблицу, иначе просто текст. И там и там с
  полем

;_Draw Line and Insert Text
(defun C:DLIT ( / en cmdname fld txt fc tblset tblobj row col pt
                 whatAcadVer
                 drawLP
               )
;;;Ф-ция возвращает версию Автокада ввиде 2004 2005 2006 2007 2008
(defun whatAcadVer ( / Aver)
(setq Aver (atof (substr (getvar "ACADVER") 1 4)))
(cond ((= 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)))
;_darw Line & Polyline
(defun drawLP ( cmdname )
  (setvar "CMDECHO" 1)
  (command cmdname)
  (while (> (getvar "CMDACTIVE") 0)(command pause))
  (entlast)
  )
  (vl-load-com)
  (or *SCALE* (setq *SCALE* 1))
  (or *PREC* (setq *PREC* 2))
  (or *TEXTSIZE* (setq *TEXTSIZE* (getvar "TEXTSIZE")))
  (princ "\nТекущий масштаб = ")(princ *SCALE*)
  (princ "  Текущая точность округления = ")(princ *PREC*)
  (princ "  Высота текста = ")(princ *TEXTSIZE*)
  (initget "Line Polyline Setting sElect Отрезок Полилиния Установки Выбор _Line Polyline Setting sElect Line Polyline Setting sElect")
  (and
    (or ;_ > Проверяем версию
      (> (whatAcadVer) 2005)
      (alert "\nНужен Автокад версии 2006 и выше")
      ) ;_ < Проверяем версию
    (or ;_ > Запрашиваем что рисовать + опции
    (while (= (setq cmdname (getkword "\nВыберите или нарисуйте [Отрезок/Полилиния/Установки/Выбор] <Выбор>: "))
              "Setting")
      (princ "\nНовый масштабный коэффициент <")(princ *SCALE*)(princ "> : ")
      (initget 6)
      (if (setq en (getdist))(setq *SCALE* 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))
      (initget "Line Polyline Setting sElect Отрезок Полилиния Установки Выбор _Line Polyline Setting sElect Line Polyline Setting sElect")
      )
    t
    ) ;_ < Запрашиваем что рисовать + опции
  (cond
    ((= cmdname "Line")(setq en (drawLP "_.Line")))
    ((= cmdname "Polyline")(setq en (drawLP "_.Pline")))
    ((or (null cmdname)(= cmdname "sElect"))
         (princ "\nВыберите отрезок или полилинию")
         (and
           (setq tblset (ssget "_:S:E" '((0 . "LINE,*POLYLINE"))))
           (setq en (ssname tblset 0))
           )
     )
    (t nil)
    )
  ;_ Формируем поле
  (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 *SCALE*)"]\">%"
                ) ;_ strcat
          ) ;_ setq
    ;_ Создаем текст
  (setq txt (entmakex
      (list
        (cons 0 "TEXT")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbText")
        (cons 72 0)           ;_ выравнивание влево
        (cons 1 fld)
        ;(cons 7 style) ;_Текущий стиль
        ;(cons 8 layer) ;_Текущий слой
        (cons 10 '(0 0 0))
        (cons 11 '(0 0 0))
        (cons 40 *TEXTSIZE*) ;_Высота текста
        ) ;_ list
      ) ;_ entmakex
          )
  ;_ Копируем в буфер и обратно
  (setvar "cmdecho" 0)
  (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)
  )

Re: Связь графических объектов и текста

> VVA
Хорошо работает программа. Настройка масштаба - удобная вешь. Спасибо.
Неплохо было бы иметь аналогичную программу и для площади контура. Вот здесь:
https://www.caduser.ru/forum/topic25081.html
приводятся программы для вставки площади в таблицу, но надо выбирать саму таблицу, а в ваших программах достаточно только ткнуть в ячейку или куда угодно.

Re: Связь графических объектов и текста

> Владимир Громов
Опубликовал здесь
https://www.caduser.ru/forum/topic25081.html

Re: Связь графических объектов и текста

> VVA
А можно в этой программе добавлять заново нарисованные линии к уже существующим, я имею в виду одну цифру и несколько разных полилиний

Re: Связь графических объектов и текста

А отрезок прямолинеен? Если, да, то создать динамический блок - линия с параметром длина, далее извлечение атрибута из всего чнртежа + таблица автокад с автообновлением.... Ну это так... вариантик....

Re: Связь графических объектов и текста

Тут возникла (по крайней мере у меня) потребность узнать, на какие объекты ссылается поле (или поля), вставленные в текст, ячейку таблицы или атрибут. Набросал коротенькую прогу. Выкладываю для тестирования.
Принцип работы: указываете на текст, ячейку таблицы или атрибут с полем и посвечиваются все примитивы, на которые поле(поля) ссылаются.

(defun C:FldViz ( / txt lst ss _get-en-from-field)
;Возвращает список примитивов, входящих в поле (поля)
;txt - имя примитива хранителя поля (текст или атрибут таблица) [ENAME],
;      возвращаемое nentsel
(defun _get-en-from-field (txt / dict field field_data lst lst1)
  (and
    (setq dict (cdr (assoc 360 (entget txt)))) ;_Ename Dictionary Словарь примитива
    (setq dict
           (cdr (assoc 360 (member '(3 . "ACAD_FIELD") (entget dict))))
    ) ;_Enable Field Dictionary Есть поля в объекте
    (setq dict (cdr (assoc 360 (member '(3 . "TEXT") (entget dict))))) ;_ Field Record Запись поля
 ;_Sub Field Records Вторичные записи полей
    (setq field (mapcar 'cdr
                        (vl-remove-if
                          '(lambda (x) (/= (car x) 360))
                          (entget dict)
                        ) ;_ end of vl-remove-if
                ) ;_ end of mapcar
    ) ;_ end of setq
    (or (setq lst1 ;_прямые ссылки полей на примитивы
               (apply 'append
                      (mapcar '(lambda (field_data)
                                 (mapcar 'cdr
                                         (vl-remove-if
                                           '(lambda (x) (/= (car x) 331))
                                           (entget field_data)
                                         ) ;_ end of vl-remove-if
                                 ) ;_ end of mapcar
                               ) ;_ end of lambda
                              field
                      ) ;_ end of mapcar
               ) ;_ end of apply
        ) ;_ end of setq
        t
    ) ;_ end of or
    (if (setq ;_вложенные ссылки полей на примитивы (формулы в полях)
          lst (apply 'append
                     (mapcar '(lambda (field_data)
                                (mapcar 'cdr
                                        (vl-remove-if
                                          '(lambda (x) (/= (car x) 360))
                                          (entget field_data)
                                        ) ;_ end of vl-remove-if
                                ) ;_ end of mapcar
                              ) ;_ end of lambda
                             field
                     ) ;_ end of mapcar
              ) ;_ end of apply
        ) ;_ end of setq
      (setq
        lst (apply 'append
                   (mapcar '(lambda (field_data)
                              (mapcar 'cdr
                                      (vl-remove-if
                                        '(lambda (x) (/= (car x) 331))
                                        (entget field_data)
                                      ) ;_ end of vl-remove-if
                              ) ;_ end of mapcar
                            ) ;_ end of lambda
                           lst
                   ) ;_ end of mapcar
            ) ;_ end of apply
      ) ;_ end of setq
    ) ;_ end of if
  ) ;_ end of and
  (append lst lst1)
)
  (and
    (setq txt (car(nentsel "\nУкажите объект с полем")))
    (setq lst (_get-en-from-field txt))
    (setq ss (ssadd ))
    (mapcar '(lambda(x)(ssadd x ss)) lst)
    (sssetfirst ss ss)
    )
  (setq ss nil)
  (princ)
  )

Re: Связь графических объектов и текста

Действительно показывает длина каких линий закреплена за этой цифрой. Работает вроде нормально

Re: Связь графических объектов и текста

Точнее длина одной линии. Как добавить несколько объектов в набор?

Re: Связь графических объектов и текста

> Electr
В тексте может быть несколько полей, или формула. В общем случае поле может ссылаться на несколько примитивов.

Точнее длина одной линии. Как добавить несколько объектов в набор?

Обрабатывает только тексты (в отличие от предыдущей - тексты, ячейки таблицы, атрибуты блока)

(defun C:FldVizSel ( / txt lst ss _get-en-from-field)
;Возвращает список примитивов, входящих в поле (поля)
;txt — имя примитива хранителя поля (текст или атрибут таблица) [ENAME],
;      возвращаемое nentsel
(defun _get-en-from-field (txt / dict field field_data lst lst1)
  (and
    (setq dict (cdr (assoc 360 (entget txt)))) ;_Ename Dictionary Словарь примитива
    (setq dict
           (cdr (assoc 360 (member '(3 . "ACAD_FIELD") (entget dict))))
    ) ;_Enable Field Dictionary Есть поля в объекте
    (setq dict (cdr (assoc 360 (member '(3 . "TEXT") (entget dict))))) ;_ Field Record Запись поля
 ;_Sub Field Records Вторичные записи полей
    (setq field (mapcar 'cdr
                        (vl-remove-if
                          '(lambda (x) (/= (car x) 360))
                          (entget dict)
                        ) ;_ end of vl-remove-if
                ) ;_ end of mapcar
    ) ;_ end of setq
    (or (setq lst1 ;_прямые ссылки полей на примитивы
               (apply 'append
                      (mapcar '(lambda (field_data)
                                 (mapcar 'cdr
                                         (vl-remove-if
                                           '(lambda (x) (/= (car x) 331))
                                           (entget field_data)
                                         ) ;_ end of vl-remove-if
                                 ) ;_ end of mapcar
                               ) ;_ end of lambda
                              field
                      ) ;_ end of mapcar
               ) ;_ end of apply
        ) ;_ end of setq
        t
    ) ;_ end of or
    (if (setq ;_вложенные ссылки полей на примитивы (формулы в полях)
          lst (apply 'append
                     (mapcar '(lambda (field_data)
                                (mapcar 'cdr
                                        (vl-remove-if
                                          '(lambda (x) (/= (car x) 360))
                                          (entget field_data)
                                        ) ;_ end of vl-remove-if
                                ) ;_ end of mapcar
                              ) ;_ end of lambda
                             field
                     ) ;_ end of mapcar
              ) ;_ end of apply
        ) ;_ end of setq
      (setq
        lst (apply 'append
                   (mapcar '(lambda (field_data)
                              (mapcar 'cdr
                                      (vl-remove-if
                                        '(lambda (x) (/= (car x) 331))
                                        (entget field_data)
                                      ) ;_ end of vl-remove-if
                              ) ;_ end of mapcar
                            ) ;_ end of lambda
                           lst
                   ) ;_ end of mapcar
            ) ;_ end of apply
      ) ;_ end of setq
    ) ;_ end of if
  ) ;_ end of and
  (append lst lst1)
)
  (and
    (setq ss (ssget '((0 . "*TEXT"))))
    (setq txt (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
    (setq lst (mapcar '_get-en-from-field txt))
    (setq lst (apply 'append lst))
    (setq lst (vl-remove-if 'null lst))
    (setq ss nil ss (ssadd))
    (mapcar '(lambda(x)(ssadd x ss)) lst)
    (sssetfirst ss ss)
    )
  (setq ss nil)
  (princ)
  )

Re: Связь графических объектов и текста

Вариант FldViz с выбором нескольких объектов с полем

(defun C:FldVizM ( / txt lst ss _get-en-from-field txtlist Flag)
  ;;Возвращает список примитивов, входящих в поле (поля)
;_   txt      - имя примитива хранителя поля (текст или атрибут таблица) [ENAME],
;_              возвращаемое nentsel
(defun _get-en-from-field (txt / dict field field_data lst lst1)
  (and
    (setq dict (cdr (assoc 360 (entget txt)))) ;_Ename Dictionary Словарь примитива
    (setq dict
           (cdr (assoc 360 (member '(3 . "ACAD_FIELD") (entget dict))))
    ) ;_Enable Field Dictionary Есть поля в объекте
    (setq dict (cdr (assoc 360 (member '(3 . "TEXT") (entget dict))))) ;_ Field Record Запись поля
 ;_Sub Field Records Вторичные записи полей
    (setq field (mapcar 'cdr
                        (vl-remove-if
                          '(lambda (x) (/= (car x) 360))
                          (entget dict)
                        ) ;_ end of vl-remove-if
                ) ;_ end of mapcar
    ) ;_ end of setq
    (or (setq lst1 ;_прямые ссылки полей на примитивы
               (apply 'append
                      (mapcar '(lambda (field_data)
                                 (mapcar 'cdr
                                         (vl-remove-if
                                           '(lambda (x) (/= (car x) 331))
                                           (entget field_data)
                                         ) ;_ end of vl-remove-if
                                 ) ;_ end of mapcar
                               ) ;_ end of lambda
                              field
                      ) ;_ end of mapcar
               ) ;_ end of apply
        ) ;_ end of setq
        t
    ) ;_ end of or
    (if (setq ;_вложенные ссылки полей на примитивы (формулы в полях)
          lst (apply 'append
                     (mapcar '(lambda (field_data)
                                (mapcar 'cdr
                                        (vl-remove-if
                                          '(lambda (x) (/= (car x) 360))
                                          (entget field_data)
                                        ) ;_ end of vl-remove-if
                                ) ;_ end of mapcar
                              ) ;_ end of lambda
                             field
                     ) ;_ end of mapcar
              ) ;_ end of apply
        ) ;_ end of setq
      (setq
        lst (apply 'append
                   (mapcar '(lambda (field_data)
                              (mapcar 'cdr
                                      (vl-remove-if
                                        '(lambda (x) (/= (car x) 331))
                                        (entget field_data)
                                      ) ;_ end of vl-remove-if
                              ) ;_ end of mapcar
                            ) ;_ end of lambda
                           lst
                   ) ;_ end of mapcar
            ) ;_ end of apply
      ) ;_ end of setq
    ) ;_ end of if
  ) ;_ end of and
  (append lst lst1)
)
(setvar "ERRNO" 0)
(setq Flag t)
(while Flag
  (setq txt (car(nentsel "\nУкажите объект с полем <готово>: ")))
  (if txt (setq txtlist (cons txt txtlist))
    (if (= (getvar "ERRNO") 52)(setq Flag nil)
      (princ "\nПромахнулись... Попробуйте еще раз"))
    )
  (setvar "ERRNO" 0)
  )
  (and txtlist
    (setq lst (mapcar '_get-en-from-field txtlist))
    (setq lst (apply 'append lst))
    (setq lst (vl-remove-if 'null lst))
    (setq ss nil ss (ssadd))
    (mapcar '(lambda(x)(ssadd x ss)) lst)
    (sssetfirst ss ss)
    )
  (setq ss nil)
  (princ)
  )

Re: Связь графических объектов и текста

> VVA
Попробывал этот липс - ОЧЕНЬ УДОБНО - это еще не то слово.
1. Только можно ли это все облачить в одну оболочку для запуска одной командой и из появившегося меню выбрать нужное действие??? (как это сделано здесь: > VVA (2007-09-20 14:01:27) )???
2. Мне кажется, что удобнее было бы появление результата на курсоре, а не замена имеющегося текста (несколько раз забывал добавить новый текст для этого)... а так же в случае когда не известно наперёд сколько будет позиций...
Впринципе все... Очень понравилось и очень удобно.

Re: Связь графических объектов и текста

и 3. для просто пользователей (вроде меня)... Можно ли сделать в начале подробное описание самого липса??? (комбинации кнопок для вызова и основные действия) ..

Re: Связь графических объектов и текста

... и тема по тиху застыла.. а жаль..

Re: Связь графических объектов и текста

А начало было интересным.

Re: Связь графических объектов и текста

Да, очень интересная тема. Я тоже электрик и тоже хочу автоматизировать подсчет кабелей. Какое все-таки резюме у этой темы - сделали это или нет? Потому что программ-то написали много и неясно что каждая из них делает...

Re: Связь графических объектов и текста

Уважаемый VVA? А нельзя ли сделать так, чтобы поле "вставало"  сразу в начало линни или в центр или конец? И не нужно было бы указывать место? Это так альтернатива для ускорения черчения ...

Re: Связь графических объектов и текста

> Voltron
http://dwg.ru/f/showthread.php?t=12911
Оно?

Re: Связь графических объектов и текста

Оно!!! Покорнейше благодарю!!!  smile

Re: Связь графических объектов и текста

Не сочтите за наглость, а нельзя ли значение длины(поля) сразу в буфер класть?

Re: Связь графических объектов и текста

Переписываю функцию, есть вопрос:
Есть множество динамических блоков разной длины, с пустым атрибутом.
Есть .*TEXT с полями для одного из этих блоков (заготовка)
Подскажите, как распространить эту заготовку по атрибутам  блока 'EffectiveName, и связать по ObjectID

Приблизительный процесс:
-Берётся текст с заготовкой
-Берётся один из блоков.
=Заготовка с полями распространяется по атрибутам аналогичных 'EffectiveName блоков и привязывается по ObjId
=_regenall
=Profit!




Статичный вариант, с зашитой заготовкой:

(defun c:FVV ( / LM:GetObjectID acdoc acspc e eb i ii o p val elist) (vl-load-com)
;;;http://www.cadtutor.net/forum/archive/index.php/t-57782.html?s=5868f10b6c04f0c55def20c8e85e764e
;;;1d_Inciner mod of С:AMF
(setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
; modelspace control
acspc (vlax-get-property acdoc (if (= 1 (getvar 'CVPORT)) 'Paperspace 'Modelspace))
)

;;;анализ разрядности системы
(defun LM:GetObjectID ( doc obj )
;; © Lee Mac 2011
(if (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
(vlax-invoke-method (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false)
(itoa (vla-get-Objectid obj)))
)

;выбор разных блоков :-С
(setq vs (ssget))
(setq ii 0)
(repeat (sslength vs)
(setq eb (ssname vs ii))
(setq elist (entget eb))

(if (and (= (cdr (assoc 0 elist)) "INSERT") (= (cdr (assoc 66 elist)) 1))
(progn
(setq e (cadar (acet-insert-attrib-get (list eb 4))))
(setq i (LM:GetObjectID acdoc (vlax-ename->vla-object eb)))

;фиксированный атрибут :-С
(setq o
(strcat
"(" (vlax-get-property (vlax-ename->vla-object eb) 'EffectiveName) ") "
"%<\\AcObjProp Object(%<\\_ObjId " i ">%).Parameter(9).UpdatedDistance \\f \"%lu2%pr0\">%"
))

;простановка имени блока+ фиксированное поле в атрибут
(setq val (vlax-ename->vla-object e))
(if
     (vl-catch-all-error-p
       (vl-catch-all-apply
         'vla-put-TextString(list val o)))
    (progn
       (princ "\nError. Can't pase text. ")
      (setq errFlag T)
      ); end progn
); end if
))
(setq ii (1+ ii))
);repeat
)