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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы.

LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы.

Ответ
Поиск в этой теме
Непрочитано 01.08.2013, 12:14 6 |
LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы.
skkkk
 
Регистрация: 20.03.2008
Сообщений: 2,653

По многочисленным просьбам трудящихся форумчан и не только их. Возник этот вопрос довольно давно.
Может ли поле принимать текстовое значение ячейки таблицы?
Возможно ли выцепить текст у таблиц? Как это можно реализовать на AutoLISP?
Как вставить полем содержимое ячейки таблицы?
Как должно быть многим известно, в AutoCAD'е не предусмотрена возможность сослаться полем на ТЕКСТОВУЮ ячейку таблицы.
Попытаемся исправить это, на мой взгляд, досадное недоразумение.
Предлагается для обсуждения и тестирования код, который содержит в себе функции из перечисленных выше тем, несколько переработанные и собранные в одну, то есть, в две команды. Отдельное спасибо VVA за весомую помощь в реализации идеи.

Доступные команды:
- TextCellField (или TCF) - создание поля, ссылающегося на указанную ячейку таблицы (текстовую или числовую);
- UpdateTextCellFields (или UTCF) - обновление всех созданных командой TextCellField полей после редактирования исходных ячеек с последующей регенерацией. Как вариант, эту команду можно повесить вместо привычной регенерации. Если полей, созданных командой TextCellField в чертеже нет, то просто произойдет регенерация.

Входящие параметры:
У пользователя запрашивается две точки: первая - внутри ячейки таблицы, на которую нужно сослаться полем, вторая - точка вставки текстового объекта с полем.

Алгоритм:
После указания пользователем двух точек из указанной ячейки (1-я точка) берется содержимое и очищается от форматирования. В Свойствах чертежа (команда _dwgprops), во вкладке Прочее (Custom) создается свойство с именем следующего формата:
Код:
[Выделить все]
Table<handle таблицы>_<адрес ячейки>
Значение этого свойства заполняется строкой, взятой из ячейки, которая может иметь как текстовый, так и числовой формат. Во второй указанной точке создается поле, источником информации для которого служит только что созданное свойство чертежа (значение этого поля становится равным значению ячейки таблицы). Если ячейка пуста, то полю присвоится значение "----".
После того, как пользователь изменит значение в исходной ячейке таблицы, необходимо запустить команду UpdateTextCellFields. Она "пройдется" по всем созданным командой TextCellField свойствам чертежа и назначит каждому актуальное значение "своей" ячейки, затем выполнит регенерацию, присвоив полям новые (если они изменились) значения свойств чертежа. При удалении строк или столбцов из таблицы поле будет продолжать ссылаться на абсолютный адрес ячейки, т.е. если пользователь, например, сослался полем на ячейку A2, а затем удалил вторую строку таблицы, то поле начнет ссылаться на ту ячейку, адрес которой стал A2 (бывший A3). Если ячейка (или вся таблица), на которую ссылались поля, перестала существовать, то свойство чертежа, оставшееся без "своей" ячейки, будет удалено из списка Custom-свойств, и на экран выведется сообщение о количестве недостающих ячеек; "осиротевшие" поля "попадут за решетку". Поэтому удалять строки и столбцы, впрочем как и в случае с "родными" полями, надо осторожно, с головой.


Результат:
Результатом работы лиспа является объект MTEXT, содержащий в себе искомое поле. После двойного щелчка по этому тексту можно скопировать и вставить поле в нужное место. Можно было бы и сразу занести его в буфер обмена, но я пока не знаю, как. Да и вообще, код еще очень далек от совершенства, это пока, так скажем, бета-версия.


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


Используемые в коде функции и их авторы:

Используемые в академическом плане:
insfld Кулик Алексей aka kpblc
get_cell_value VVA
и некоторые другие из ссылок в начале сообщения.

Библиотечные:
_dwgru-dwgprops-get-all-prop VVA
_dwgru-dwgprops-get-custom-prop VVA
_dwgru-dwgprops-set-custom-prop VVA
_dwgru-assoc-multi VVA
_dwgru-assoc VVA
_dwgru-string-some-part ShaggyDoc
_dwgru-str->list Елпанов Евгений
dwgru-string-to-list ShaggyDoc
dwgru-string-right-part ShaggyDoc
dwgru-string-left-part ShaggyDoc
LM:UnFormat Lee Mac
Number2Alpha Gilles Chanteau
Alpha2Number Gilles Chanteau

Выражаю свои глубочайшие признательность и благодарность Авторам. Если ошибся в авторстве, прошу простить и поправить.
Все необходимые функции включены в листинг.
______________________________________________
Обновление 07/08/2013
Теперь поле вставляется туда, куда укажет пользователь: это может быть ячейка таблицы, текст, мтекст, мультивыноска. Если пользователь укажет на пустое место или на ту часть чертежа, где нет текстовых объектов, то создастся новый мтекст с полем.
Код:
[Выделить все]
 ;;--------------------------------------------------------
;;Команда cоздает поле (field), ссылающееся на текстовое значение ячейки таблицы.
;; Работает в связке с командой UpdateTextCellFields (см.ниже) 
;; Подробности на http://forum.dwg.ru/showthread.php?p=1130077#post1130077
;; Описание используемых функций
;; get_cell_by_pick
;; get_cell_value
;; _dwgru-dwgprops-get-all-prop
;; _dwgru-dwgprops-get-custom-prop
;; _dwgru-dwgprops-set-custom-prop
;; _dwgru-assoc-multi
;; _dwgru-assoc
;; _dwgru-string-some-part
;; _dwgru-str->list
;; dwgru-string-to-list
;; dwgru-string-right-part
;; dwgru-string-left-part
;; LM:UnFormat
;; Number2Alpha
;; Alpha2Number
(defun C:TCF nil (C:TextCellField))
(defun C:TextCellField ( / *error* adoc oldOSMODE pt pt2 str TextHeight ColumnWidth txtobj tblobj tblset lst row col TargetObj)
(vl-load-com)
	(defun *error* (msg)
		(if oldOSMODE (setvar "OSMODE" oldOSMODE))
		(vla-EndUndomark adoc)
		(princ)
	) ;defun *error*
	(vla-StartUndomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
	(setq oldOSMODE (getvar "OSMODE"))
	(while (null row)
		(setvar "OSMODE" 0)
		(if (null pt)(setq pt (getpoint "\nВыберите ячейку таблицы <Отмена>:")))
		(setvar "OSMODE" oldOSMODE)
		(if (null pt) (progn (princ "\nОтменено пользователем") (exit)))
		(if (get_cell_by_pick pt)
			(progn
				(setvar "OSMODE" 0)
				(if (null pt2) (setq pt2 (getpoint "\nУкажите точку, ячейку или текстовый объект для вставки поля <Отмена> : ")))
				(setvar "OSMODE" oldOSMODE)
				(if (null pt2) (progn (princ "\nОтменено пользователем") (exit)))
				(_dwgru-dwgprops-set-custom-prop 
					(strcat "Table" 
							(vla-get-Handle tblobj)
							"_" 
							(vl-princ-to-string (Number2Alpha (1+ col)))
							(vl-princ-to-string (1+ row))
					) ;_ end of strcat
					(LM:UnFormat (vla-GetText tblobj row col) nil)
					nil
				);_ end of (_dwgru-dwgprops-set-custom-prop)
				(setq str
					(strcat "%<\\AcVar CustomDP.Table" 
							(vl-princ-to-string (vla-get-Handle tblobj))
							"_"
							(vl-princ-to-string (Number2Alpha (1+ col)))
							(vl-princ-to-string (1+ row))
							">%"
					) ;_ end of strcat
				) ;_ end of setq str
				(setq TextHeight (vla-GetCellTextHeight tblobj row col))
				(setq ColumnWidth (vla-GetColumnWidth tblobj col))
				(cond
					(	(get_cell_by_pick pt2) ;_cond #1
						(if (eq (vla-IsContentEditable tblobj row col) :vlax-true)
							(progn
								(vla-SetText tblobj row col str)
								(vla-SetCellTextHeight tblobj row col TextHeight)
							) ;_ end of progn
							(progn
								(princ "\nСодержимое ячейки заблокировано")
							) ;_ end of progn
						) ;_ end of if
					) ;_end of cond #1
					(	(null (ssget "_C" (polar pt2 (/ pi 4) 3) (polar pt2 (/ (* 5 pi) 4) 3) '((0 . "*TEXT,ATTRIB,ATTDEF,MULTILEADER")))) ;_cond #2
						(progn
							(setq txtobj
								(vla-addMtext
									(vla-get-ModelSpace adoc) 
									(vlax-3d-point (trans pt2 1 0))
									ColumnWidth
									str
								) ;_ end of vla-addtext
							) ;_ end of setq txtobj
							(vla-put-Height txtobj TextHeight)
						) ;_ end of progn
					) ;_end of cond #2
					(	(setq ss (ssget "_C" (polar pt2 (/ pi 4) 3) (polar pt2 (/ (* 5 pi) 4) 3) '((0 . "TEXT")))) ;_cond #3
						(progn
							(setq TargetObj (vlax-ename->vla-object (ssname ss 0)))
							(vla-put-TextString TargetObj str)
						) ;_ end of progn
					) ;_end of cond #3
					(	(setq ss (ssget "_C" (polar pt2 (/ pi 4) 3) (polar pt2 (/ (* 5 pi) 4) 3) '((0 . "MTEXT")))) ;_cond #4
						(progn
							(setq TargetObj (vlax-ename->vla-object (ssname ss 0)))
							(vla-put-TextString TargetObj "-")
							(vla-put-TextString TargetObj str)
						) ;_ end of progn
					) ;_end of cond #4
					(	(setq ss (ssget "_C" (polar pt2 (/ pi 4) 3) (polar pt2 (/ (* 5 pi) 4) 3) '((0 . "MULTILEADER")))) ;_cond #5
						(progn
							(setq TargetObj (vlax-ename->vla-object (ssname ss 0)))
							(vla-put-TextString TargetObj (strcat "\\pxse0.76;" str))
							(command "_.UPDATEFIELD" ss "")
							(setq jstf (vla-get-TextJustify TargetObj))
							(vla-put-TextJustify TargetObj 1)
							(vla-put-TextJustify TargetObj jstf)
						) ;_ end of progn
					) ;_end of cond #5
				) ;_ end of cond
			) ;_ end of progn
			(progn
				(setvar "OSMODE" 0)
				(setq pt (getpoint "\nЭто не таблица!\nВыберите ячейку таблицы <Отмена>:"))
				(setvar "OSMODE" oldOSMODE)
				(setq row nil)
				(if (null pt) (progn (princ "\nОтменено пользователем") (exit)))
			) ;_ end of progn
		) ;_ end of if
	) ;_ end of while
	(vla-EndUndomark adoc)
	(princ)
) ;_ end of defun C:TextCellField


;;--------------------------------------------------------
;; Команда обновляет свойства чертежа (dwgprops) и поля, созданные 
;; командой TextCellField (см. выше) в соответствии с содержимым ячейки таблицы
(defun C:UTCF nil (C:UpdateTextCellFields))
(defun C:UpdateTextCellFields ( / adoc DWGPROP n tblobj ExcellColumn row col)
	(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
	(setq DWGPROP (_dwgru-dwgprops-get-all-prop nil))
	(setq n 0)
	(foreach item DWGPROP
		(cond 
			(	(wcmatch (car item) "Table*")
				(progn
					(setq tblobj (vlax-ename->vla-object (handent (substr (dwgru-string-left-part (car item) "_") 6))))
					(setq ExcellColumn (dwgru-string-right-part (car item) "_"))
					(setq row (cadr (_dwgru-str->list ExcellColumn)))
					(setq col (Alpha2Number (car (_dwgru-str->list ExcellColumn))))
					(if (and tblobj (>= (vla-get-columns tblobj) col) (>= (vla-get-rows tblobj) row))
						(progn
							(_dwgru-dwgprops-set-custom-prop 
								(car item) 
								(get_cell_value tblobj ExcellColumn)
								nil_
							)
						) ;_ end of progn
						(progn
							(vla-RemoveCustomByKey (vla-Get-SummaryInfo adoc) (car item))
							(setq n (1+ n))
						) ;_ end of progn
					) ;_ end of if
				) ;_ end of progn
			)
		) ;_ end of cond
	) ;_ end of foreach
	(if (> n 0) (alert (strcat "Количество удаленных ячеек, на которые ссылались поля: " (vl-princ-to-string n))))
	(vla-regen adoc AcAllViewports)
	(princ)
) ;_ end of defun C:UpdateTextCellFields


;;--------------------------------------------------------
;; Функция получает ячейку таблицы по указанной точке
;; Если точка внутри таблицы, возвращает список вида (<vla-объект таблицы> <номер строки> <номер столбца>)
;; если вне таблицы - возвращает nil
(defun get_cell_by_pick (pt / )
				(setq tblobj nil
					  tblset nil
					  tblset (ssget "_X" '((0 . "ACAD_TABLE")))
				) ;_ end of setq
				(setq lst
					   (mapcar 'vlax-ename->vla-object
						   (vl-remove-if 'listp (mapcar 'cadr (ssnamex tblset)))
					   ) ;_ end of mapcar
				) ;_ end of setq
				(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
									) ;_ end of vla-HitTest
								) ;_ end of =
								(setq tblobj x)
							) ;_ end of and
						) ;_ end of or
					) ;_ end of lambda
					lst
				) ;_ end of mapcar
				(if (and tblobj row col) (list tblobj row col) nil)
) ;_ end of defun (get_cell_by_pick)


;;--------------------------------------------------------
;; Функция получает строку - значение ячейки таблицы
(defun get_cell_value (tblobj ExcellColumn /)
;;; tblobj - vla-object 
;;; ExcellColumn - string - "A1" B2"
;;; Use
;;; (get_cell_value (vlax-ename->vla-object(car(entsel))) "A2")
	(apply
		'(lambda (col row)
			(LM:UnFormat (vla-GetText tblobj (1- row) (1-(Alpha2Number  col))) nil)
		)
		(_dwgru-str->list (strcase ExcellColumn))
	)
) ;_ end of defun get_cell_value


;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-dwgprops-get-all-prop
;;; *
;;; * 23/07/2008 Версия 0002. Makswell
;;; * 27/12/2007 Версия 0001.  Владимир Азарко   (VVA)
;;; ************************************************************************
(defun _dwgru-dwgprops-get-all-prop (Doc / si ret nc key value)
;;; Возвращает свойства файла, установленные командой _dwgprops
;;; Возвращается ассоциативный список, где ключом служит:
;;;      - для свойств, созданных пользователем (закладка ПРОЧИЕ)
;;;          ИМЯ СВОЙСТВА
;;;     - для стандартных свойств (закладка ДОКУМЕНТ)
;;;             Поле                  Ключ  
;;;             НАЗВАНИЕ           - *TITLE*
;;;             АВТОР              - *AUTHOR*
;;;             ТЕМА               - *SUBJECT*
;;;             КЛЮЧЕВЫЕ СЛОВА     - *KEYWORDS*
;;;             ЗАМЕТКИ            - *COMMENTS*
;;;             БАЗА ГИПЕРССЫЛКИ   - *HYPERLINK*
;;; Doc - указатель на обрабатываемый документ, nil - текущий

  ;|
;;; Пример
(_dwgru-dwgprops-get-all-prop nil) ;;;(("*AUTHOR*" "VVA") ("*COMMENTS*" "Заметка") ("*HYPERLINK*" "База")
                               ;;;("*KEYWORDS*" "Ключ") ("*TITLE*" "Назван") ("*SUBJECT*" "Тема") ("UNIQKEY" "Key"))
|;
  (and
    (or	Doc
	(setq Doc (vla-get-activeDocument (vlax-get-acad-object)))
    )
    (setq si (vla-get-SummaryInfo Doc))
    (setq ret (list
		(list "*AUTHOR*" (vla-get-author si))
		(list "*COMMENTS*" (vla-get-comments si))
		(list "*HYPERLINK*" (vla-get-HyperlinkBase si))
		(list "*KEYWORDS*" (vla-get-keywords si))
		(list "*TITLE*" (vla-get-Title si))
		(list "*SUBJECT*" (vla-get-Subject si))
	      )
    )
    (setq nc (vla-numcustominfo si))
    (while (> nc 0)
      (vla-GetCustomByIndex si (- nc 1) 'key 'value)
      (setq ret (append ret (list (list key value))))
      (setq nc (1- nc))
    )
    (vlax-release-object si)
  )
  ret
) ;_end of defun (_dwgru-dwgprops-get-all-prop)


;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-dwgprops-get-custom-prop
;;; *
;;; * 27/12/2007 Версия 0001.  Владимир Азарко   (VVA)
;;; ************************************************************************
(defun _dwgru-dwgprops-get-custom-prop (key Doc / app counter counter2 counter3 doc dwgprops k v)
;;; Возвращает значение свойства, созданного пользователем (команда _dwgprops)
;;; Возвращается ассоциативный список, где ключом служит:
;;;      - для свойств, созданных пользователем (закладка ПРОЧИЕ)
;;;    key - строка ИМЯ СВОЙСТВА (закладка ПРОЧИЕ)
;;;        - для стандартных свойств (закладка ДОКУМЕНТ)
;;;              Поле                  Ключ  
;;;             НАЗВАНИЕ           - *TITLE*
;;;             АВТОР              - *AUTHOR*
;;;             ТЕМА               - *SUBJECT*
;;;             КЛЮЧЕВЫЕ СЛОВА     - *KEYWORDS*
;;;             ЗАМЕТКИ            - *COMMENTS*
;;;             БАЗА ГИПЕРССЫЛКИ   - *HYPERLINK*
;;;
;;; Использует функцию библиотеки
;;;                 _dwgru-dwgprops-get-all-prop
;;;                 _dwgru-assoc  (_dwgru-assoc-multi)
 
;;; Doc - указатель на обрабатываемый документ, nil - текущий
 
 (cadr(_dwgru-assoc key (_dwgru-dwgprops-get-all-prop Doc)))
) ;_end of defun (_dwgru-dwgprops-get-custom-prop)


;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-dwgprops-set-custom-prop
;;; *
;;; * 23/07/2008 Версия 0002. Makswell
;;; * 27/12/2007 Версия 0001.  Владимир Азарко   (VVA)
;;; ************************************************************************
(defun _dwgru-dwgprops-set-custom-prop (key value Doc / si)
;;;Создает в свойствах рисунка (команда _dwgprops закладка ПРОЧИЕ)
;;; Свойство с ключом key и значение value
;;; Если свойства не было, оно создается, иначе изменяется
;;;    key - строка ИМЯ СВОЙСТВА (закладка ПРОЧИЕ)
;;;    value - строка (string) - значение свойства  
;;; Использует функцию библиотеки
;;;                 _dwgru-dwgprops-get-custom-prop
;;; Doc - указатель на обрабатываемый документ, nil - текущий
;;; Возвращает - nil
  ;|
;;;Пример
(_dwgru-dwgprops-set-custom-prop "dwgru" "dwgru-dwgprops-set-custom-prop" nil)
|;
  (or Doc
      (setq Doc (vla-Get-ActiveDocument (vlax-Get-Acad-Object)))
  )
  (setq si (vla-Get-SummaryInfo Doc))
  (if (_dwgru-dwgprops-get-custom-prop key Doc)
    (progn
      (setq key (car (_dwgru-assoc key (_dwgru-dwgprops-get-all-prop Doc))))
      (vla-SetCustomByKey si key value)
    )
    (vla-AddCustomInfo si key value)
  )
) ;_end of defun (_dwgru-dwgprops-set-custom-prop)


(defun _dwgru-assoc-multi (key lst)
  (if (= (type key) 'str)
    (setq key (strcase key))
    ) ;_ end of if
  (vl-remove-if-not
    (function
      (lambda (a / b)
        (and (setq b (car a))
             (or (and (= (type b) 'str) (= (strcase b) key)) (equal b key))
             ) ;_ end of and
        ) ;_ end of lambda
      ) ;_ end of function
    lst
    ) ;_ end of vl-remove-if-not
) ;_ end of defun (_dwgru-assoc-multi)
(defun _dwgru-assoc (key lst)
  (car (_dwgru-assoc-multi key lst))
) ;_ end of defun (_dwgru-assoc)


;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-string-some-part
;;; *
;;; * 03/12/2007 Версия 0001.  Сергей Зуев   (ShaggyDoc)
;;; ************************************************************************
(defun _dwgru-string-some-part
                              (string delim_char is_left_part / lst)
    ;;;  возврат левой (если is_left_part)или правой части
    ;;;  строки string с разделителем  delim_char
    ;;; Использует функцию библиотеки
    ;;;                 dwgru-string-to-list

    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delim_char  - разделитель (string)
    ;;; is_left_part  - T или NIL. Если истина (T), то слева. Иначе справа. (boolean)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:
  ;|
(_dwgru-string-some-part " M1:=100" "=" T) ;_Результат   " M1:"
(_dwgru-string-some-part " M1:=100" "=" NIL)  ;_Результат  "100"
(_dwgru-string-some-part " M= M1:=100" "=" T) ;_ Результат  " M"
(_dwgru-string-some-part " M= M1:=100" "=" NIL) ;_ Результат  "100"
(_dwgru-string-some-part "просто строка" "=" T)  ;_ Результат  "просто строка"
(_dwgru-string-some-part "просто строка" "=" NIL) ;_Результат   ""
|;
	(if (> (length	(setq lst
						(dwgru-string-to-list string delim_char)
					) ;_ end of setq
			) ;_ end of length
			1
		) ;_ end of >
		;; если список, иначе была просто строка
		(if is_left_part (car lst) (last lst))
		(if is_left_part string "")
	) ;_ end of  if
) ;_ end of defun (_dwgru-string-some-part)


;;--------------------------------------------------------
;; Функция разделяет строку на список текстовых и цифровых составляющих.
;; Запятая между цифрами, зменяется на точечный разделитель дробной части.
(defun _dwgru-str->list (s)
                 ;|
***************************************************************************************
*
* Программа разделяет строку на список текстовых и цифровых составляющих.
* Запятая между цифрами, зменяется на точечный разделитель дробной части.
* 
**************************************************************************************
*
* Написал Елпанов Евгений       (ElpanovEvgeniy)
*
* дата создания (13/10/2007 a 11:42)
* написано во время конкурса на форуме:
* http://www.cadxp.com/XForum+viewthread-fid-101-tid-16943-page-2.html
***************************************************************************************
* Пример использования и результатов работы:
* (_dwgru-str->list "point.25.4cm.")           => ("point." 25.4 "cm.")
* (_dwgru-str->list "point.25,4cm.")           => ("point." 25.4 "cm.")
* (_dwgru-str->list "point.3/8cm.")            => ("point." 0.375 "cm.")
* (_dwgru-str->list "qvf12qsdf125 5sf 56dfv2") => ("qvf" 12 "qsdf" 125 " " 5 "sf " 56 "dfv" 2)
***************************************************************************************
 |;
 (defun str->list1 (a b f)
  (cond
   ((null b)
    (list (if f
           (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           ) ;_ cond
           (vl-list->string (reverse a))
          ) ;_ if
    ) ;_ list
   )
   (f
    (if (or (= (car b) 44) (< 45 (car b) 58))
     (str->list1 (cons (car b) a) (cdr b) f)
     (cons (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           ) ;_ cond
           (str->list1 (list (car b)) (cdr b) nil)
     ) ;_ cons
    ) ;_ if
   )
   (t
    (if (< 47 (car b) 58)
     (cons (vl-list->string (reverse a)) (str->list1 (list (car b)) (cdr b) t))
     (str->list1 (cons (car b) a) (cdr b) nil)
    ) ;_ if
   )
  ) ;_ cond
 ) ;_ defun
 (setq s (vl-string->list s))
 (str->list1 (list (car s))
             (cdr s)
             (if (or (= (car s) 44) (< 45 (car s) 58))
              t
             ) ;_ if
 )
) ;_ end of defun (_dwgru-str->list)


;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-string-to-list
;;; *
;;; * 03/12/2007 Версия 0001.  Сергей Зуев   (ShaggyDoc)
;;; ************************************************************************
(defun dwgru-string-to-list (str delimiter / pos)
;;; Возврат списка подстрок строки str с разделителем  delimiter 
;;; Использует функцию библиотеки
    ;;;                 dwgru-string-replace
    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delimiter  - разделитель (string)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:
    ;|
(dwgru-string-to-list "М:1=100" "=") ;_Результат ("М:1" "100")
(dwgru-string-to-list "М:1=" "=") ;_Результат  ("М:1" "")
(dwgru-string-to-list "" "=") ;_Результат  ("")
(dwgru-string-to-list "1 2 3   4   5" " ") ;_Результат  ("1" "2" "3" "4" "5")
 (dwgru-string-to-list "Я говорю, он говорит, они говорят" ",")
 ;_Результат ("Я говорю" " он говорит" " они говорят")
 (dwgru-string-to-list "123456789" "=") ;_Результат  ("123456789") 
|;
  ;;; для варианта, когда разделитель пробел надо
;;; заменить в строке все двойные пробелы на одинарные
    (if (= delimiter (chr 32))
        (setq str (dwgru-string-replace str (strcat (chr 32) (chr 32)) delimiter))
    ) ;_ end of if
    (if (setq pos (vl-string-search delimiter str))
        (cons
            (substr str 1 pos)
            (dwgru-string-to-list
                (substr
                    str
                    (+ (strlen delimiter) pos 1)
                ) ;_ end of substr
                delimiter
            ) ;_ end of ru-string-pl-string-to-list
        ) ;_ end of cons
        (cons str '())
    ) ;_ end of if
) ;_ end of defun (dwgru-string-to-list)


;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-string-right-part
;;; *
;;; * 03/12/2007 Версия 0001.  Сергей Зуев   (ShaggyDoc)
;;; ************************************************************************
(defun dwgru-string-right-part (string delim_char)
;;; возврат правой половины строки после разделителя
;;; Использует функцию библиотеки
    ;;;                 _dwgru-string-some-part
    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delim_char  - разделитель (string)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:
  
;|
(dwgru-string-right-part " M1:=100" "=")   ;_Результат  "100"
(dwgru-string-right-part " M= M1:=100" "=") ;_Результат  "100"
(dwgru-string-right-part "просто строка" "=") ;_Результат   "просто строка"
(dwgru-string-right-part "просто=" "=")  ;_ ""
(dwgru-string-right-part "890" ".")  ;_Результат  ""
(dwgru-string-right-part ".2" ".")  ;_Результат  2
(dwgru-string-right-part "2" ".")  ;_Результат  "" 
(dwgru-string-right-part "2.400" ".") ;_Результат  "400"
|;
    (_dwgru-string-some-part string delim_char NIL)
) ;_ end of defun (dwgru-string-right-part)


;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-string-left-part
;;; *
;;; * 03/12/2007 Версия 0001.  Сергей Зуев   (ShaggyDoc)
;;; ************************************************************************

(defun dwgru-string-left-part (string delim_char)
;;; возврат левой половины строки до разделителя delim_char
;;; Использует функцию библиотеки
    ;;;                 _dwgru-string-some-part

    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delim_char  - разделитель (string)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:
;|  
(dwgru-string-left-part " M1:=100" "=")  ;_Результат  " М1:"
(dwgru-string-left-part " M= M1:=100" "=")  ;_Результат  " М"
(dwgru-string-left-part "просто строка" "=") ;_Результат   "просто строка"
(dwgru-string-left-part "просто=" "=")  ;_Результат  "просто"
|;
(_dwgru-string-some-part string delim_char T)
) ;_ end of defun (dwgru-string-left-part)


;;-------------------=={ UnFormat String }==------------------;;
;;                                                            ;;
;;  Returns a string with all MText formatting codes removed. ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  str - String to Process                                   ;;
;;  mtx - MText Flag (T if string is for use in MText)        ;;
;;------------------------------------------------------------;;
;;  Returns:  String with formatting codes removed            ;;
;;------------------------------------------------------------;;

(defun LM:UnFormat ( str mtx / _replace rx )

    (defun _replace ( new old str )
        (vlax-put-property rx 'pattern old)
        (vlax-invoke rx 'replace str new)
    )
    (if (setq rx (vlax-get-or-create-object "VBScript.RegExp"))
        (progn
            (setq str
                (vl-catch-all-apply
                    (function
                        (lambda ( )
                            (vlax-put-property rx 'global     actrue)
                            (vlax-put-property rx 'multiline  actrue)
                            (vlax-put-property rx 'ignorecase acfalse) 
                            (foreach pair
                               '(
                                    ("\032"    . "\\\\\\\\")
                                    (" "       . "\\\\P|\\n|\\t")
                                    ("$1"      . "\\\\(\\\\[ACcFfHLlOopQTW])|\\\\[ACcFfHLlOopQTW][^\\\\;]*;|\\\\[ACcFfHLlOopQTW]")
                                    ("$1$2/$3" . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
                                    ("$1$2"    . "\\\\(\\\\S)|[\\\\](})|}")
                                    ("$1"      . "[\\\\]({)|{")
                                )
                                (setq str (_replace (car pair) (cdr pair) str))
                            )
                            (if mtx
                                (_replace "\\\\" "\032" (_replace "\\$1$2$3" "(\\\\[ACcFfHLlOoPpQSTW])|({)|(})" str))
                                (_replace "\\"   "\032" str)
                            )
                        )
                    )
                )
            )
            (vlax-release-object rx)
            (if (null (vl-catch-all-error-p str))
                str
            )
        )
    )
) ;_end of defun (LM:UnFormat)


(defun Number2Alpha (Num# / Val#)
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
	(if (< Num# 27)
		(chr (+ 64 Num#))
		(if (= 0 (setq Val# (rem Num# 26)))
			(strcat (Number2Alpha (1- (/ Num# 26))) "Z")
			(strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
		);if
	);if
);defun Number2Alpha


(defun Alpha2Number (Str$ / Num#)
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
  (if (= 0 (setq Num# (strlen Str$)))
    0
    (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
       (Alpha2Number (substr Str$ 2))
    );+
  );if
);defun Alpha2Number
(princ)

Вложения
Тип файла: lsp TextCellField.lsp (25.6 Кб, 1242 просмотров)


Последний раз редактировалось skkkk, 24.05.2018 в 15:21. Причина: Обновление
Просмотров: 125825
 
Непрочитано 27.01.2015, 20:52 skkkk
#41
perpetule


 
Регистрация: 23.09.2008
Волгоград
Сообщений: 810
<phrase 1= Отправить сообщение для perpetule с помощью Skype™


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

Успешно реализован расчет зон молниезащиты непосредственно в dwg файле (несколько площадок).

Автору огромное спасибо! В том числе за помощь!

В свое время пытался оформить штампы таблицами, надо поискать, с программой обновление возможно без использования полей подшивки или свойств DWG, достаточно таблицы-штампа-образца (все в одном DWG).
__________________
tc71

Последний раз редактировалось perpetule, 29.01.2015 в 12:36.
perpetule вне форума  
 
Автор темы   Непрочитано 27.01.2015, 23:37
#42
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


perpetule, справедливо. Во-первых, при копировании через буфер обмена значения свойств чертежа из вкладки "Прочее" не переносятся в другой чертеж. Во-вторых, уникальный в пределах файла буквенно-цифровой индекс таблицы (handle) при вставке ее в другой чертеж изменится, а адресация полей строго привязана к этому индексу. Скорее всего, метод переноса этой связи (источник-поле) между файлами, который реализован в Автокаде, недоступен из лиспа, однако сделать это возможно иным путем:
1. Создать реактор на команду копирования, который активизирует процедуру переноса между файлами, либо иначе придется производить такое копирование посредством отдельной команды.
2. При запуске такой процедуры одним из вышеуказанных способов к каждой таблице, на которую имеются ссылки в виде полей в данном файле, прикрепить расширенные данные - строку содержащую в себе handle исходной таблицы, либо некое число, созданное, как вариант, генератором случайных чисел. Однако, при таком подходе есть шанс, хоть и небольшой, напороться на коллизию - ситуацию, когда номер копируемой таблицы совпадет с номером таблицы, уже существующей в новом файле - тогда поле может сослаться не на ту таблицу. К тому же, расширенные данные могут использоваться другими программами, в следствие чего возможен их конфликт.
3. Обеспечить перенос свойств вкладки "Прочее" из одного файла в другой.
4. В новом файле (по реактору на команду вставки) назначить каждому свойству адрес новой таблицы, сопоставляя его с адресом в расширенных данных.

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

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

А пока, кроме
Цитата:
Сообщение от perpetule Посмотреть сообщение
Пути решения - расчетную часть держать в одном экземпляре, исходники
могу предложить альтернативный путь решения, пришедший на ум: сохранять копию файла - либо в проводнике, либо через "Сохранить как..." - и в нее уже копировать все, что нужно из других файлов. При таком подходе связи сохранятся. Правда и тут есть свои проблемы: например, если в разных файлах настройки одноименных текстовых или иных стилей, слоев, состав описаний блоков будут разными, то результаты копирования могут быть неожиданными. Будьте бдительными. И не забывайте о таком инструменте, как шаблоны.

perpetule, спасибо за конструктивные замечания!
skkkk вне форума  
 
Непрочитано 28.01.2015, 08:15
#43
Кулик Алексей aka kpblc
Moderator

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


Offtop: skkkk, если интересно мое мнение (код писать не буду, тут и так наворочено столько... )
  1. Я бы не делал ставку на РД. Может быть, будет проще / легче / устойчивее использовать словари?
  2. Опять же - для реактора на копирастинг: загнать соответствующие данные во внедокументную переменную (через vl-bb-set) и при вставке читать данные оттуда? Правда, возникает неизбежный вопрос: а что будет при вставке внешней ссылки? А что будет при вставке блока из другого файла? А что будет, если человек решил скопировать из ворда кусок текста и вставить его как OLE-объект (к примеру); или копирует окружность?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.01.2015, 13:58
#44
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
skkkk, если интересно мое мнение
Еще как!

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я бы не делал ставку на РД. Может быть, будет проще / легче / устойчивее использовать словари?
Я вот тоже склоняюсь не использовать РД, во-первых, из-за ограничения объема, а во-вторых, из-за возможных конфликтов с другими приложениями. А вот со словарями другая песня - их можно затереть пургеном. И если в свете копирования в другой файл это не страшно - скопировал и тут же принудительно сам стер, а вот в свете использования их в качестве хранилища вместо "Свойств чертежа" (тех, что на вкладке "Прочие") - тут возникают вопросы: а как их уберечь от затирания?
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Опять же - для реактора на копирастинг: загнать соответствующие данные во внедокументную переменную (через vl-bb-set)
Не знал о такой возможности. Для копирастинга вполне вариант. Уже воспылал надеждой, что эти переменные хранятся между сеансами - ан нет.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Правда, возникает неизбежный вопрос: а что будет при вставке внешней ссылки? А что будет при вставке блока из другого файла? А что будет, если человек решил скопировать из ворда кусок текста и вставить его как OLE-объект (к примеру); или копирует окружность?
Ну так в реакторе, точнее в реакции, прописывать обработку только таблиц и только тех, которые "помечены" программой TCF, а если вставлена, например, окружность, то реакции никакой. Или я не так понял, что ты имел в виду?
skkkk вне форума  
 
Непрочитано 28.01.2015, 15:01
#45
Кулик Алексей aka kpblc
Moderator

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


Кстати, пока не забыл: словари можно записывать и на объекты. Вроде бы они не уничтожаются чисткой. Даже если принудительно чистить словари dwg.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2015, 12:50
#46
Avodo


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
и возможность удалять (преобразовывать в текст) поля, созданные данной программой.
Так а в чем проблема, я теперь активно пользуюсь Вашей программой (еще раз спасибо!), а для передачи в смежные отделы конечно же очищаю (преобразую в текст) все поля. Использую для этого лисп FieldToText взятый здесь: http://dwg.ru/dnl/1932

Еще писал что у меня было 10 связей - отдельных таблиц, это было не удобно, обновлялось долго, а бывало что и слетали все. При разработке нового проекта добавилось много оборудования вот и связей стало 30...

Также есть момент, что если файл с полями созданными через TCF вставить в другой как внешнюю ссылку - то поля превратятся в решетки, думаю уже об этом говорилось. Было бы идеально исправить, но и без этого польза неимоверная от TCF !! А то что там не копируются эти поля - так не для этого и созданы. Даже если штатные поля копируются, не значит что поля TCF должны. Ведь штатные вообще текст из ячеек не читают. Поэтому лично я использую в основном штатные поля, а для обозначения марок оборудования на схемах и в спецификациях применяю TCF. Очень выручает!!

Последний раз редактировалось Avodo, 01.10.2015 в 14:20.
Avodo вне форума  
 
Автор темы   Непрочитано 04.10.2015, 10:04
#47
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Avodo Посмотреть сообщение
Так а в чем проблема
На мой взгляд проблема в том, что FieldToText преобразует в текст либо все поля, либо поля только в выбранных примитивах, а я говорил о том, что нужна команда для преобразования только тех полей, которые созданы посредством TCF, плюс нужно почистить неиспользуемые свойства чертежа, дабы не копить хлам.
Цитата:
Сообщение от Avodo Посмотреть сообщение
10 связей
Offtop: Не знаю, может, у меня одного так по какой-то причине, но эти связи с данными - это такой пожиратель времени! Можно ждать по несколько минут, пока обновится одна связь, не представляю, что будет, если их сделать 10.

Цитата:
Сообщение от Avodo Посмотреть сообщение
Также есть момент, что если файл с полями созданными через TCF вставить в другой как внешнюю ссылку - то поля превратятся в решетки, думаю уже об этом говорилось.
Интересное замечание. Не припомню, чтоб говорилось об этом, разве только Алексей не это имел в виду
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Правда, возникает неизбежный вопрос: а что будет при вставке внешней ссылки?
Я тогда понял его неправильно. Там обсуждался реактор на команду _paste, и я подумал, что речь идет о вставке других объектов (не таблиц), а ведь сейчас вижу, что Алексей, похоже, подразумевал именно это. При создании этого функционала я не думал почему-то о такой возможности, тогда я и ссылками внешними не пользовался практически. Не было нужды. А проблема, конечно, достойна рассмотрения. Удалось бегло потестировать да покопаться в этом вопросе, выяснил, что если перенести свойства чертежа (внешней ссылки) в новый чертеж, то поля начнут отображаться верно. Как будет время, постараюсь добавить в программу эту возможность, но быстро - не обещаю. Avodo, пока прошу Вас и остальных заинтересованных в этом вопросе лиц подумать, как бы хотелось это увидеть: автоматическое обновление через реактор на внедрение внешней ссылки или по команде UTCF? Второй вариант на мой взгляд предпочтительней. А пока для переноса пользовательских свойств из чертежа в чертеж можно воспользоваться программой Александра Ривилиса ObjectARX. Получение/изменение из AutoLisp свойств чертежа (Summary Info).

Последний раз редактировалось skkkk, 04.10.2015 в 10:14.
skkkk вне форума  
 
Непрочитано 21.10.2015, 23:26
#48
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


Всем привет. Ребята, почему-то у меня код не работает: просит выбрать ячейку таблицы, я выбираю, и дальше - ничего (см. скрины). Autocad 2016.
Миниатюры
Нажмите на изображение для увеличения
Название: Screen Shot.PNG
Просмотров: 89
Размер:	17.2 Кб
ID:	158963  Нажмите на изображение для увеличения
Название: Screen Shot 001.PNG
Просмотров: 87
Размер:	19.3 Кб
ID:	158964  Нажмите на изображение для увеличения
Название: Screen Shot 002.PNG
Просмотров: 76
Размер:	16.8 Кб
ID:	158965  
allrather вне форума  
 
Автор темы   Непрочитано 22.10.2015, 00:39
#49
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


1. Что при этом происходит в командной строке? Желательно сделать ее побольше, и показать хоть скрин.
2. Можно посмотреть на файл?
3. Не в блоке ли находится таблица (или, может быть, там текст с линиями?)
skkkk вне форума  
 
Непрочитано 22.10.2015, 01:04
#50
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


skkkk,
1. В командной строке не происходит ничего.
2. Файл прикрепляю.
3. Нет, таблица - чистой воды, таблица.

Вот блин, решил прикрепить Вам файл: создал новый чертеж, скопировал туда 2 таблицы - и все работает! Как так?
Прикрепляю рабочий файл с отдельными таблицами (вот в нем все работает), а также 2 скрина, которые демонстрируют "ничего не происходит в командной строке" и "свойства таблицы" в старом файле.

Так вот, как я уже отметил, возник новый вопрос. Почему все стало работать в новом файле?
И тут я решил прикрепить Вам и старый файл, дабы доказать, что не вру. Решил удалить в нем все листы типа конфиденциально и все дела. Удалил я листы, попробовал, оказалось и в нем все стало работать. Вот это номер.
Может, у Вас есть какие догадки на этот счет?
Миниатюры
Нажмите на изображение для увеличения
Название: Screen Shot 001.PNG
Просмотров: 63
Размер:	42.8 Кб
ID:	158968  Нажмите на изображение для увеличения
Название: Screen Shot.PNG
Просмотров: 68
Размер:	58.4 Кб
ID:	158969  
Вложения
Тип файла: dwg
DWG 2013
Таблицы.dwg (83.0 Кб, 951 просмотров)
allrather вне форума  
 
Непрочитано 22.10.2015, 16:41
#51
d.mOnII

Проектирование
 
Регистрация: 22.01.2013
Минск
Сообщений: 123
Отправить сообщение для d.mOnII с помощью Skype™


Доброго дня.
проверил ЛИСП из сообщения автора, все супер, вставляет текст с полем и инфой из ячейки
Вопрос1: как вставлять такое поле в атрибут динамического блока? можноли это реализовать?
Вопрос2: если файл с полями созданными через TCF вставить в другой как внешнюю ссылку - то поля превратятся в решетки, можно ли это исправить? (вопрос, как я понял, задаю уже повторно)

----- добавлено через ~8 мин. -----
пока что решение проблемы можно сделать так: создаем текстовые поля в объектах многострочного текста при исполнении лисп.команды TCF (как промежуточные), а затем в атрибут блока вставляем текстовое поле со значением содержимого промежуточного объекта [многострочный текст, созданный при исполнении лиспа] и на выходе получаем блок с атрибутом и текстовым полем, который в качестве внешней ссылки отображается корректно

Последний раз редактировалось d.mOnII, 22.10.2015 в 16:50.
d.mOnII вне форума  
 
Непрочитано 22.10.2015, 19:06
#52
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


Ребзя. Ну очень мне нравится этот код, особенно, когда работает. Вот не могу уловить закономерности, когда же он работает, а когда нет. Прикрепляю файл, где он не работает. А как у Вас?
Вложения
Тип файла: dwg
DWG 2013
TCF не работает.dwg (85.5 Кб, 830 просмотров)
allrather вне форума  
 
Автор темы   Непрочитано 23.10.2015, 02:53
#53
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от allrather Посмотреть сообщение
Прикрепляю файл, где он не работает. А как у Вас?
У меня тоже не работает.

Цитата:
Сообщение от allrather Посмотреть сообщение
И тут я решил прикрепить Вам и старый файл, дабы доказать, что не вру. Решил удалить в нем все листы типа конфиденциально и все дела. Удалил я листы, попробовал, оказалось и в нем все стало работать. Вот это номер.
Может, у Вас есть какие догадки на этот счет?
Цитата:
Сообщение от allrather Посмотреть сообщение
таблица - чистой воды, таблица
Есть догадка. Точнее, не догадка, а четкое понимание того, почему не работает. Довелось потестировать на 2015-м. Дело в том, что в приложенном файле (в котором не работает) одна из таблиц - хоть и таблица, но не "чистой воды". Если выбрать ее и вызвать окно свойств (Ctrl+1 из верхней цифровой строки клавиатуры), будет видно, что этот объект называется "Основная надпись". Это, видимо, таблица СПДС. Почему "видимо"? Потому что в СПДС я не работал, как и в 2015-м Автокаде (в котором судя по всему СПДС уже внедрен в коробку), а вывод такой я сделал из того, что в окне свойств появилась группа свойств "СПДС".

Как мы знаем, лисп в Автокаде делится на две ветки: AutoLISP и Visual LISP. Обычно, многие задачи можно решить альтернативно: как одной ветвью, так и второй. Но реалии показывают, что одно проще выполнить первым, другое - вторым, поэтому многие используют мешанину из этих веток - лично мне так удобнее, да и не всё, что можно реализовать через одно, можно реализовать и через второе.

Если копнуть глубже, чем описано в шапке, то алгоритм программы TCF таков: при указании точки внутри ячейки происходит программная выборка всех таблиц средствами AutoLISP и поочередный анализ каждой таблицы на предмет принадлежности ей указанной точки методом HitText из Visual LISP и далее считывание значения ячейки методом GetText из него же.

Так вот, Автолисп распознает ее как таблицу. А для Visual LISP это другой объект, для которого методы HitText и GetText не срабатывают. Иными словами, пока в файле есть такая вот таблица от СПДС, программа не сработает. Почти уверен, что я смогу сделать так, чтобы в выборку не попадали эти "не чистой воды" таблицы, и с обычными таблицами код будет работать в любом файле. Но вот не знаю, можно ли что-то предпринять, чтобы код срабатывал и на таких таблицах. Дело в том, что большая часть используемых в коде функций не моя - я просто собрал все воедино, - и мне скорее всего понадобиться помощь VVA, чтоб в этом разобраться. Тут, похоже, придется переписывать значительную часть кода на новый алгоритм, который мне пока непонятен, да и есть большие сомнения, что это вообще удастся. И не знаю, где найти информацию по программной работе с такими объектами (чувствую, в 2015-м это не первый сюрприз). Так что предлагаю пока исключить таблицы СПДС из файла для пользования кодом, а я по мере возможности постараюсь подправить код под то, чтобы работал в файле с присутствием таких таблиц, но не именно с ними. Не абсолютное, конечно, решение, но хотя бы уже знаем, где собака зарыта - и то хорошо.

Цитата:
Сообщение от d.mOnII Посмотреть сообщение
Вопрос1: как вставлять такое поле в атрибут динамического блока? можноли это реализовать?
Думаю, что это можно. У меня был где-то код по извлечению того, что находится в блоке под мышью в момент указания, и если это будет атрибут, то записать поле туда. А пока что идеальный, потому что единственный, вариант, который я и хотел предложить:
Цитата:
Сообщение от d.mOnII Посмотреть сообщение
в атрибут блока вставляем текстовое поле со значением содержимого промежуточного объекта
Цитата:
Сообщение от d.mOnII Посмотреть сообщение
Вопрос2: если файл с полями созданными через TCF вставить в другой как внешнюю ссылку - то поля превратятся в решетки, можно ли это исправить?
Да, действительно, это уже спрашивалось, и я взял на заметку этот вопрос. Только сейчас очень большая загруженность по работе, поэтому когда я смогу решить его (равно как и все остальные) - точно сказать не могу. Постараюсь, но скоро - не обещаю .
skkkk вне форума  
 
Непрочитано 23.10.2015, 08:57
#54
Кулик Алексей aka kpblc
Moderator

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


Offtop: Никакой СПДС в "коробку" AutoCAD не внедрен. Ни для какой версии.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.10.2015, 09:31
#55
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
Это, видимо, таблица СПДС. Почему "видимо"? Потому что в СПДС я не работал, как и в 2015-м Автокаде (в котором судя по всему СПДС уже внедрен в коробку), а вывод такой я сделал из того, что в окне свойств появилась группа свойств "СПДС".
Это Автодесковский СПДС модуль. Причем для 2010 Автокада. На 2015 у меня все это видится как прокси. И походу но не "внедрен в коробку"

Цитата:
Сообщение от skkkk Посмотреть сообщение
А для Visual LISP это другой объект, для которого методы HitText и GetText не срабатывают
Наличие свойств можно проверить с помощью функции vlax-property-available-p
Миниатюры
Нажмите на изображение для увеличения
Название: spds.png
Просмотров: 103
Размер:	40.3 Кб
ID:	159050  
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.10.2015, 10:54
#56
allrather


 
Регистрация: 27.02.2011
Минск
Сообщений: 169
Отправить сообщение для allrather с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
Есть догадка. Точнее, не догадка, а четкое понимание того, почему не работает. Довелось потестировать на 2015-м. Дело в том, что в приложенном файле (в котором не работает) одна из таблиц - хоть и таблица, но не "чистой воды". Если выбрать ее и вызвать окно свойств (Ctrl+1 из верхней цифровой строки клавиатуры), будет видно, что этот объект называется "Основная надпись". Это, видимо, таблица СПДС. Почему "видимо"? Потому что в СПДС я не работал, как и в 2015-м Автокаде (в котором судя по всему СПДС уже внедрен в коробку), а вывод такой я сделал из того, что в окне свойств появилась группа свойств "СПДС".
СПДС не внедрен и слава Богу!
Да, Вы правы. Все дело в СПДС. Нашел я СПДСфайл, из которого он подгружает свои таблицы. Причем, здесь все таблицы "чистой воды" и все работает.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Так что предлагаю пока исключить таблицы СПДС из файла для пользования кодом, а я по мере возможности постараюсь подправить код под то, чтобы работал в файле с присутствием таких таблиц, но не именно с ними. Не абсолютное, конечно, решение, но хотя бы уже знаем, где собака зарыта - и то хорошо.
Проблема в том, что код не работает в файле, в котором когда-либо БЫЛИ эти самые таблицы СПДС! То есть при удалении таблиц СПДС (даже, на всякий, юзал _purge, _audit) код, все равно, не работает и на "чистой воды". Но вот при удалении ЛИСТОВ, в которых были таблицы (таблицы у меня, в принципе, только в листах), код начинает работать.
На всякий, может кому будет дико интересно. Прикреплю 2 файла с "чистой воды" таблицами: в первом когда-то в листах были таблицы СПДС(сейчас таблицы удалены и никаких видимых признаков их существования не осталось, но остались листы, в которых они были) и код не работает, во втором таблиц не было (то есть листы с таблицами были удалены, именно листы) и все работает!
TCF не работает.dwg
TCF работает.dwg
Согласен, знание места зарытой собаки - ценно!

Цитата:
Сообщение от skkkk Посмотреть сообщение
Почти уверен, что я смогу сделать так, чтобы в выборку не попадали эти "не чистой воды" таблицы, и с обычными таблицами код будет работать в любом файле. Но вот не знаю, можно ли что-то предпринять, чтобы код срабатывал и на таких таблицах.
Думаю, не стоит этим заниматься. СПДС на мыло. Я сейчас вплотную работаю над удалением СПДСа из своей жизни.


Цитата:
Сообщение от VVA Посмотреть сообщение
Это Автодесковский СПДС модуль. Причем для 2010 Автокада. На 2015 у меня все это видится как прокси. И походу но не "внедрен в коробку"
Для 2016 автокада, насколько я понимаю и вижу.
allrather вне форума  
 
Автор темы   Непрочитано 23.10.2015, 12:10
#57
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от allrather Посмотреть сообщение
Прикреплю 2 файла с "чистой воды" таблицами: в первом когда-то в листах были таблицы СПДС(сейчас таблицы удалены и никаких видимых признаков их существования не осталось, но остались листы, в которых они были) и код не работает
В одном из листов дополнительная графа является таблицей СПДС. При ее удалении начинает работать.

Цитата:
Сообщение от VVA Посмотреть сообщение
Наличие свойств можно проверить с помощью функции vlax-property-available-p
Это-то ясно. Вот дамп свойств и методов, которые удалось снять с этого объекта:
Команда: (vlax-dump-object (vlax-ename->vla-object (car (entsel))) T)
Выберите объект: ; ISiberiaBasicInscription: ISiberiaBasicInscription Interface
; Значения свойств:
; Application (RO) = #<VLA-OBJECT IAcadApplication 000000013f82a130>
; Document (RO) = #<VLA-OBJECT IAcadDocument 0000000040623618>
; EntityTransparency = "ПоСлою"
; Handle (RO) = "CBA"
; HasExtensionDictionary (RO) = 0
; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000000004a628d98>
; Layer = "EIR_025"
; Linetype = "Continuous"
; LinetypeScale = 1.0
; Lineweight = -1
; Material = "ByLayer"
; Name (RO) = "Боковая надпись - инвентарный номер СПДС"
; ObjectID (RO) = 53
; ObjectName (RO) = "AcDbTable"
; OwnerID (RO) = 57
; PlotStyleName = "ByLayer"
; Position = (20.0 90.0 0.0)
; Style = "Основная надпись [базовый]"
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 000000004a6377f0>
; Visible = -1
; Поддерживаемые методы:
; ArrayPolar (3)
; ArrayRectangular (6)
; Copy ()
; Delete ()
; GetBoundingBox (2)
; GetExtensionDictionary ()
; GetXData (3)
; Highlight (1)
; IntersectWith (2)
; Mirror (2)
; Mirror3D (3)
; Move (2)
; Rotate (2)
; Rotate3D (3)
; ScaleEntity (2)
; SetXData (2)
; TransformBy (1)
; Update ()
T

А вот для обычной таблицы:
Команда: (vlax-dump-object (vlax-ename->vla-object (car (entsel))) T)
Выберите объект: ; IAcadTable: Интерфейс IAcadTable для работы с таблицами.
; Значения свойств:
; AllowManualHeights = 0
; AllowManualPositions = 0
; Application (RO) = #<VLA-OBJECT IAcadApplication 000000013f82a130>
; BreaksEnabled = 0
; BreakSpacing = 13.75
; Columns = 10
; ColumnWidth (RO) = ...Индексированное содержимое не выводится...
; Direction = (1.0 0.0 0.0)
; Document (RO) = #<VLA-OBJECT IAcadDocument 0000000040623618>
; EnableBreak (RO) = ...Индексированное содержимое не выводится...
; EntityTransparency = "ПоСлою"
; FlowDirection = 0
; Handle (RO) = "FC0"
; HasExtensionDictionary (RO) = 0
; HasSubSelection (RO) = 0
; HeaderSuppressed = -1
; Height = 55.0
; HorzCellMargin = 0.5
; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000000004a624dd8>
; InsertionPoint = (33381.8 29692.0 0.0)
; Layer = "0"
; Linetype = "Continuous"
; LinetypeScale = 1.0
; Lineweight = -1
; Material = "ByLayer"
; MinimumTableHeight (RO) = 47.6667
; MinimumTableWidth (RO) = 35.0
; ObjectID (RO) = 55
; ObjectName (RO) = "AcDbTable"
; OwnerID (RO) = 58
; PlotStyleName = "ByLayer"
; RegenerateTableSuppressed = 0
; RepeatBottomLabels = 0
; RepeatTopLabels = 0
; RowHeight (RO) = ...Индексированное содержимое не выводится...
; Rows = 11
; StyleName = "GOST_21.101_F3"
; TableBreakFlowDirection = 1
; TableBreakHeight = 0.0
; TableStyleOverrides (RO) = (1 2)
; TitleSuppressed = -1
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 000000004a625610>
; VertCellMargin = 0.5
; Visible = -1
; Width = 185.0
; Поддерживаемые методы:
; ArrayPolar (3)
; ArrayRectangular (6)
; ClearSubSelection ()
; ClearTableStyleOverrides (1)
; Copy ()
; CreateContent (3)
; Delete ()
; DeleteCellContent (2)
; DeleteColumns (2)
; DeleteContent (2)
; DeleteRows (2)
; EnableMergeAll (3)
; FormatValue (4)
; GenerateLayout ()
; GetAlignment (1)
; GetAttachmentPoint (2)
; GetAutoScale (2)
; GetAutoScale2 (3)
; GetBackgroundColor (1)
; GetBackgroundColorNone (1)
; GetBlockAttributeValue (3)
; GetBlockAttributeValue2 (4)
; GetBlockRotation (2)
; GetBlockScale (2)
; GetBlockTableRecordId (2)
; GetBlockTableRecordId2 (3)
; GetBoundingBox (2)
; GetBreakHeight (1)
; GetCellAlignment (2)
; GetCellBackgroundColor (2)
; GetCellBackgroundColorNone (2)
; GetCellContentColor (2)
; GetCellDataType (4)
; GetCellExtents (3)
; GetCellFormat (2)
; GetCellGridColor (3)
; GetCellGridLineWeight (3)
; GetCellGridVisibility (3)
; GetCellState (2)
; GetCellStyle (2)
; GetCellStyleOverrides (2)
; GetCellTextHeight (2)
; GetCellTextStyle (2)
; GetCellType (2)
; GetCellValue (2)
; GetColumnName (1)
; GetColumnWidth (1)
; GetContentColor (1)
; GetContentColor2 (3)
; GetContentLayout (2)
; GetContentType (2)
; GetCustomData (4)
; GetDataFormat (3)
; GetDataType (3)
; GetDataType2 (5)
; GetExtensionDictionary ()
; GetFieldId (2)
; GetFieldId2 (3)
; GetFormat (1)
; GetFormula (3)
; GetGridColor (2)
; GetGridColor2 (3)
; GetGridDoubleLineSpacing (3)
; GetGridLineStyle (3)
; GetGridLinetype (3)
; GetGridLineWeight (2)
; GetGridLineWeight2 (3)
; GetGridVisibility (2)
; GetGridVisibility2 (3)
; GetHasFormula (3)
; GetMargin (3)
; GetMinimumColumnWidth (1)
; GetMinimumRowHeight (1)
; GetOverride (3)
; GetRotation (3)
; GetRowHeight (1)
; GetRowType (1)
; GetScale (3)
; GetSubSelection (4)
; GetText (2)
; GetTextHeight (1)
; GetTextHeight2 (3)
; GetTextRotation (2)
; GetTextString (3)
; GetTextStyle (1)
; GetTextStyle2 (3)
; GetValue (3)
; GetXData (3)
; Highlight (1)
; HitTest (4)
; InsertColumns (3)
; InsertColumnsAndInherit (3)
; InsertRows (3)
; InsertRowsAndInherit (3)
; IntersectWith (2)
; IsContentEditable (2)
; IsEmpty (2)
; IsFormatEditable (2)
; IsMergeAllEnabled (2)
; IsMergedCell (6)
; MergeCells (4)
; Mirror (2)
; Mirror3D (3)
; Move (2)
; MoveContent (4)
; RecomputeTableBlock (1)
; RemoveAllOverrides (2)
; ReselectSubRegion ()
; ResetCellValue (2)
; Rotate (2)
; Rotate3D (3)
; ScaleEntity (2)
; Select (8)
; SelectSubRegion (10)
; SetAlignment (2)
; SetAutoScale (3)
; SetAutoScale2 (4)
; SetBackgroundColor (2)
; SetBackgroundColorNone (2)
; SetBlockAttributeValue (4)
; SetBlockAttributeValue2 (5)
; SetBlockRotation (3)
; SetBlockScale (3)
; SetBlockTableRecordId (4)
; SetBlockTableRecordId2 (5)
; SetBreakHeight (2)
; SetCellAlignment (3)
; SetCellBackgroundColor (3)
; SetCellBackgroundColorNone (3)
; SetCellContentColor (3)
; SetCellDataType (4)
; SetCellFormat (3)
; SetCellGridColor (4)
; SetCellGridLineWeight (4)
; SetCellGridVisibility (4)
; SetCellState (3)
; SetCellStyle (3)
; SetCellTextHeight (3)
; SetCellTextStyle (3)
; SetCellType (3)
; SetCellValue (3)
; SetCellValueFromText (4)
; SetColumnName (2)
; SetColumnWidth (2)
; SetContentColor (2)
; SetContentColor2 (4)
; SetContentLayout (3)
; SetCustomData (4)
; SetDataFormat (4)
; SetDataType (3)
; SetDataType2 (5)
; SetFieldId (3)
; SetFieldId2 (5)
; SetFormat (2)
; SetFormula (4)
; SetGridColor (3)
; SetGridColor2 (4)
; SetGridDoubleLineSpacing (4)
; SetGridLineStyle (4)
; SetGridLinetype (4)
; SetGridLineWeight (3)
; SetGridLineWeight2 (4)
; SetGridVisibility (3)
; SetGridVisibility2 (4)
; SetMargin (4)
; SetOverride (4)
; SetRotation (4)
; SetRowHeight (2)
; SetScale (4)
; SetSubSelection (4)
; SetText (3)
; SetTextHeight (2)
; SetTextHeight2 (4)
; SetTextRotation (3)
; SetTextString (4)
; SetTextStyle (2)
; SetTextStyle2 (4)
; SetToolTip (3)
; SetValue (4)
; SetValueFromText (5)
; SetXData (2)
; TransformBy (1)
; UnmergeCells (4)
; Update ()
T

Как видим, для таблицы СПДС набор методов весьма скудноват.
Что это за объект такой - " ISiberiaBasicInscription"? И вообще, причем тут Сибирь?
VVA, под помощью, в которой я бы нуждался будь нужна эта обработка, я подразумевал советы и участие в переписании функции get_cell_by_pick без использования метода HitTest, а также get_cell_value без GetText. Хотя, я сомневаюсь, что это вообще возможно. Тем более, и не надо уже.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Никакой СПДС в "коробку" AutoCAD не внедрен. Ни для какой версии
Цитата:
Сообщение от VVA Посмотреть сообщение
Это Автодесковский СПДС модуль. Причем для 2010 Автокада. На 2015 у меня все это видится как прокси. И походу но не "внедрен в коробку"
Извиняюсь, я этот вывод сделал из-за наличия в окне свойств группы "СПДС". При этом владелец этой машины утверждает, что никакого СПДС он не ставил. Как это проверить? Не мог же он случайно поставиться? Или может, он поставил, да забыл? Мистика...
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 82
Размер:	70.9 Кб
ID:	159079  
skkkk вне форума  
 
Непрочитано 23.10.2015, 12:13
#58
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 433


Цитата:
Сообщение от skkkk Посмотреть сообщение
Извиняюсь, я этот вывод сделал из-за наличия в окне свойств группы "СПДС". При этом владелец этой машины утверждает, что никакого СПДС он не ставил. Как это проверить? Не мог же он случайно поставиться? Или может, он поставил, да забыл? Мистика...
Думаю, мистики никакой, просто скопирована форматка из чужого чертежа
RNB вне форума  
 
Автор темы   Непрочитано 23.10.2015, 12:19
#59
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от RNB Посмотреть сообщение
просто скопирована форматка из чужого чертежа
Но она не видится как прокси-объект, как у VVA, а четко написано: "Основная надпись". Стало быть, установлен либо СПДС, либо энейблер. Или нет?
skkkk вне форума  
 
Непрочитано 23.10.2015, 12:26
#60
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 433


Цитата:
Сообщение от skkkk Посмотреть сообщение
Но она не видится как прокси-объект, как у VVA, а четко написано: "Основная надпись". Стало быть, установлен либо СПДС, либо энейблер. Или нет?
Нет возможности проверить, поэтому написанное далее - мои размышления.
Пользователь скопировал у кого-либо форматку. Как она определяется (прокси-объект или "Основная надпись") у этого пользователя мы не знаем (или я пропустил мимо глаз?).
Пользователь продолжает пользоваться файлом сколько ему угодно, это нас и не интересует. Интересует то, что он хапнул ошибку при выполнении лиспа.
И тут уже файл попадает к нам и мы делимся на 2 лагеря:
- у кого нет спдс-модуля - видят прокси-объект
- у кого есть - "Основную надпись".
RNB вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Считывание значение ячейки таблицы в виде Field в AutoLISP tokhot LISP 9 08.01.2017 17:54
Может ли поле принимать текстовое значение ячейки таблицы? Sergiy AutoCAD 23 01.08.2013 12:30