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

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

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

Ответ
Поиск в этой теме
Непрочитано 01.08.2013, 12:14 6 | #1
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 Кб, 1254 просмотров)


Последний раз редактировалось skkkk, 24.05.2018 в 15:21. Причина: Обновление
Просмотров: 126722
 
Непрочитано 01.08.2013, 13:54
1 | #2
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


А нельзя ли вложением как lsp сохранить? А то, подозреваю, копируется из браузера как-то неправильно..?

...получилось скопировать. Идея хорошая, но имеются несколько ложек дегтя..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 01.08.2013 в 14:33.
AlexV вне форума  
 
Автор темы   Непрочитано 01.08.2013, 15:57
#3
skkkk


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Идея хорошая, но имеются несколько ложек дегтя..
Все верно. Забыл я совсем про то, что ObjectID меняется от сеанса к сеансу. Исправил в #1.
Цитата:
Сообщение от AlexV Посмотреть сообщение
А нельзя ли вложением как lsp сохранить?
Отчего ж нельзя?
Спасибо, AlexV за первые выявленные баги, и Кулику Алексею за освежение памяти
skkkk вне форума  
 
Непрочитано 01.08.2013, 16:31
#4
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от skkkk Посмотреть сообщение
Все верно. Забыл я совсем про то, что ObjectID меняется от сеанса к сеансу. Исправил в #1.
Спасибо, AlexV за первые выявленные баги, и Кулику Алексею за освежение памяти
Ну, тогды второй баг.. Не работает, однако, второй варьянт..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 01.08.2013, 16:49
#5
skkkk


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


Я тестировал на AUTOCAD 2011 X64. Все работало.
Что пишет в ком.строке?
skkkk вне форума  
 
Непрочитано 01.08.2013, 17:34
#6
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от skkkk Посмотреть сообщение
Я тестировал на AUTOCAD 2011 X64. Все работало.
Что пишет в ком.строке?
А2012 64b. Создается свойство, создается текст с полем, но поле "не читает" значение из свойств документа. Причем даже если вручную создать поле, - не читается. И категория поля при открытии в редакторе почему-то получается не "Документ", а "Системная переменная"
Изображения
Тип файла: jpg Безымянный.jpg (142.6 Кб, 2041 просмотров)
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 01.08.2013, 17:51
#7
Кулик Алексей aka kpblc
Moderator

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


AutoCAD 2014 Eng x64 : создать поле со ссылкой на текстовую ячейку таблицы не удалось.
Кстати, а что будет, если таких полей хотя бы 10 штук со ссылками на 3 разные таблицы?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.08.2013, 17:58
#8
LynxM


 
Регистрация: 17.08.2010
Kyiv
Сообщений: 688
<phrase 1= Отправить сообщение для LynxM с помощью Skype™


То работает... то нет...
Пока не выловил из-а чего и в какой момент.

AutoCAD 2011 + SPDS 7.1
__________________
Лучше не обещать, чем обещать и не исполнять.

Последний раз редактировалось LynxM, 01.08.2013 в 18:04. Причина: добавил инфор. о ПО
LynxM вне форума  
 
Автор темы   Непрочитано 03.08.2013, 01:07
#9
skkkk


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Ну, тогды второй баг.. Не работает, однако, второй варьянт..
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
AutoCAD 2014 Eng x64 : создать поле со ссылкой на текстовую ячейку таблицы не удалось.
У меня все работало на чистом файле, а на рабочем со множеством таблиц, оказалось - ни в какую.
Почему-то коряво воспринимались символы круглых скобок в имени свойства чертежа. Исправил, сейчас работает на всех файлах, пробовал на 2-х автокадах.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кстати, а что будет, если таких полей хотя бы 10 штук со ссылками на 3 разные таблицы?
Попробовал, в рабочем файле создал 100 полей из 8-ми разных таблиц - время обновления с регенерацией - 1.5сек.
skkkk вне форума  
 
Непрочитано 05.08.2013, 09:46
#10
Serghei


 
Регистрация: 07.02.2007
Мъ
Сообщений: 320


Цитата:
Сообщение от skkkk Посмотреть сообщение
Попробуйте еще раз.
Предлагаю продолжить обсуждение в той теме.
Заработала Спасибо.
Serghei вне форума  
 
Непрочитано 05.08.2013, 10:31
#11
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Работает. Единственный пока минус - обновление на компе без этого лиспа не произведется.
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 07.08.2013, 14:12
#12
skkkk


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


Добавил обновление в #1.
Цитата:
Сообщение от AlexV Посмотреть сообщение
Единственный пока минус - обновление на компе без этого лиспа не произведется.
В общем случае, этот минус неустраним. Для большего удобства, как я уже говорил, можно использовать команду UTCF вместо штатной регенерации. Это зависит от того, как вы привыкли ее производить. Если горячими клавишами (это как раз мой случай), то можно назначить это сочетание команде UTCF. Если кнопкой, то настроить на эту кнопку макрос с вызовом UTCF. Если иными способами, можно переопределить штатную команду _regenall.
skkkk вне форума  
 
Непрочитано 26.10.2013, 16:01
#13
Bora495


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


спасибо программа очень интересная.
имею только одну проблему.

итак что я сделал.
взял создал эксель таблицу записал в нее тексты.
всего три ячейки
первая - латинский шрифт
вторая - русский
третья - иврит.

сделал связь таблицы эксель с файлом чертежа.
импортировал таблицу

начал делать поля.
с латинским и кириллицей проблем нет
если я вставляю иврит поле превращается в вопросительные знаки.

вопрос, что я делаю не так?
Bora495 вне форума  
 
Непрочитано 26.10.2013, 17:07
#14
gomer

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


у вас автокад не кошерный
gomer вне форума  
 
Непрочитано 27.10.2013, 11:06
#15
Bora495


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


разобрался сам.
суть в том, что автокад привязан к региональным установкам в панели управления.
будет выставлена россия будет хорошо переносить русский язык
будет выставлен израиль будет хорошо переносить иврит.
Bora495 вне форума  
 
Непрочитано 06.02.2014, 08:48
#16
RNB

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


Личное наблюдение, может кому пригодится.
Если исходным значением для команды TCF будет поле, созданное с помощью команды TCF, то для обновления его значения команду UTCF нужно использовать 2 раза. Если поле TCF создано из поля TCF, созданного из поля TCF, то команду UTCF нужно использовать 3 раза. Ну и так далее.
Да, это абсолютно логично, если понимать алгоритм работы программы.
RNB вне форума  
 
Автор темы   Непрочитано 06.02.2014, 13:48
#17
skkkk


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


Цитата:
Сообщение от RNB Посмотреть сообщение
это абсолютно логично
Может, это и логично, но не совсем удобно и уж точно совсем не правильно. Я не рассчитывал на такой подход и постараюсь по мере возможности исправить этот баг. Но возникает еще одна мысль: может, дать пользователю вместо вставки одного поля вставлять поля до тех пор, пока он не нажмет Enter?
skkkk вне форума  
 
Непрочитано 08.02.2014, 15:21
#18
RNB

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


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

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
Но возникает еще одна мысль: может, дать пользователю вместо вставки одного поля вставлять поля до тех пор, пока он не нажмет Enter?
Ну или сделать настроку "Несколько", как вариант
RNB вне форума  
 
Непрочитано 21.03.2014, 12:41
#19
jon73


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


Спасибо! мне понравилось буду пользоваться уже придумал как... возьму таблицу из экселя и буду данне расставлять на планах с помощью этой функции!!!
jon73 вне форума  
 
Непрочитано 26.03.2014, 09:20
#20
jon73


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


При копировании таблицы и текстов с полями в другой чертеж нарушаются связи, как правильно копировать связи кто знает?
jon73 вне форума  
 
Непрочитано 20.05.2014, 10:52
#21
Sologub_S


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


Очень интересный для меня Lisp.
Спасибо большое.
Но для полноты его использования для моего случая хотелось бы услышать возможность такого варианта.
Место для вставки текста не указывать вручную, а например мне необходимо что бы текст вставлялся в исполнительные в определенные места и с определенным (одинаковым ) шагом.
Если есть такая возможность, то буду признателен.
Можно попытаться мне(чайнику) объяснить что примерно поменять. И я буду стараться если у вас нет времени на это.
Заранее благодарен.
Адрес эл. почты
[email protected]
Sologub_S вне форума  
 
Автор темы   Непрочитано 20.05.2014, 16:32
#22
skkkk


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


Sologub_S, нужен файл с примером "как есть" и с объяснениями "как надо". Тогда можно будет что-то понять.
skkkk вне форума  
 
Непрочитано 21.05.2014, 10:41
#23
Sologub_S


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


Вот пример исполнительной.
В выделенные места необходимо вставить значения из ячейки.
В некоторых местах значения повторяются.
Вложения
Тип файла: dwg
DWG 2010
Пример исполнительной.dwg (379.1 Кб, 3796 просмотров)
Sologub_S вне форума  
 
Автор темы   Непрочитано 22.05.2014, 10:39
#24
skkkk


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


Всё равно ничего не понял. В файле не нашлось ни одного объекта "Таблица". Те "таблицы", что там есть - это набор линий и текстов - с ними эта программа не работает.
Да и потом вовсе непонятна задача. Для чего может понадобиться жестко задавать в программе координаты точек вставки полей? Предполагаю, что используется шаблон, в котором от проекта к проекту не меняется расположение чертежей в пространстве модели и их количества. Но раз так, почему бы тогда просто не настроить один раз шаблон так, чтобы поля уже стояли на нужных местах и ссылались на нужные объекты?
В общем, пока больше вопросов, чем ответов...
skkkk вне форума  
 
Непрочитано 16.06.2014, 10:47
#25
Alex_GSP

Генплан
 
Регистрация: 16.03.2014
Сообщений: 33


Интересно. Вопрос к автору - если используются "Свойства чертежа" как буфер, не проще ли сразу наполнять данными вкладку "Прочие" и по необходимости вставлять поля в нужные места со ссылкой на Документ? Например, под задачу автоматического заполнения штампов на всех листах, мне видится, так проще работать. Сделать шаблон с настроенными листами и свойствами документа, работать, а как надо заполнить штампы - зашел в свойства и забил значения. И никакой таблицы в модели держать не надо.
Но как понимаю задача была в другом. За лисп спасибо - будем юзать
Alex_GSP вне форума  
 
Автор темы   Непрочитано 16.06.2014, 14:05
#26
skkkk


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


Цитата:
Сообщение от Alex_GSP Посмотреть сообщение
Вопрос к автору - если используются "Свойства чертежа" как буфер, не проще ли сразу наполнять данными вкладку "Прочие" и по необходимости вставлять поля в нужные места со ссылкой на Документ?
Для каких-то задач так, может, и проще, но, действительно, задача была в другом: создать поле со ссылкой на ТЕКСТОВУЮ ячейку таблицы, да так, чтобы оно еще и обновлялось при изменении этой ячейки. В АвтоКАДе такой возможности нет.
Цитата:
Сообщение от Alex_GSP Посмотреть сообщение
И никакой таблицы в модели держать не надо.
Так без таблиц и без наличия подобной штатной возможности сама идея такого подхода и не родилась бы.

----- добавлено через ~21 мин. -----
Цитата:
Сообщение от Alex_GSP Посмотреть сообщение
Сделать шаблон с настроенными листами и свойствами документа, работать, а как надо заполнить штампы - зашел в свойства и забил значения.
Это легко достигается штатными средствами
Признаюсь, мне с самого начала не нравилась мысль использовать в роли буфера вкладку "Прочие", поскольку этот инструмент при использовании данного лиспа становится практически недоступным для других целей. И честно говоря, есть желание это исправить.
Нужно создать (или изыскать) в файле возможность для хранения неограниченного числа строковых значений, а также для их программного чтения и изменения. Может, есть у кого мысли, как это реализовать? Словари? Расширенные данные? Кто может задать направление мысли?
skkkk вне форума  
 
Непрочитано 17.06.2014, 06:37
#27
RNB

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Нужно создать (или изыскать) в файле возможность для хранения неограниченного числа строковых значений, а также для их программного чтения и изменения. Может, есть у кого мысли, как это реализовать? Словари? Расширенные данные? Кто может задать направление мысли?
Пока в голову приходит только примитивный вариант - блок с атрибутами
RNB вне форума  
 
Непрочитано 15.01.2015, 19:57
#28
perpetule


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


skkkk
Вот это-то и обидно при наличии возможности автодеском не реализовано, а инструмент очень мощный -> вычисления в самом файле, омрачает ситуацию что автор таких вычислений с ними разберется, а вот сторонний пользователь вряд ли, пока нашел половинчатое решение, вычисление в живой таблице связь полями и вышеприведенным лиспом с мтекстом и сброс полей в мтексте. Автодеском много чего не реализовано, не дозволено им конкурентов Америке плодить ...
__________________
tc71
perpetule вне форума  
 
Непрочитано 16.01.2015, 12:59
#29
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Можно обойтись встроенными средствами!
создаем связь с экселевской таблицей с настройками:
1. разрешить обновление экселя из акада
2. передавать в акад вычисленные ячейки

Далее, работаем с таблицей в акаде, как с обычной таблицей, но при необходимости отправляем изменения в экселевский файл.
Сразу после изменений, появляется уведомление о изменении экселя и обновляем таблицу в чертеже.

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

__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 16.01.2015, 15:31
#30
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от skkkk Посмотреть сообщение
Нужно создать (или изыскать) в файле возможность для хранения неограниченного числа строковых значений, а также для их программного чтения и изменения. Может, есть у кого мысли, как это реализовать? Словари? Расширенные данные? Кто может задать направление мысли?
Я как-то примеривался к таблице autocad...пока тормознул...не до этого... Противникам этого метода - было желание иметь все нужные данные в самом чертеже и визуально их контролировать.
roaa вне форума  
 
Автор темы   Непрочитано 17.01.2015, 15:25
#31
skkkk


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Нужно создать (или изыскать) в файле возможность для хранения неограниченного числа строковых значений, а также для их программного чтения и изменения. Может, есть у кого мысли, как это реализовать? Словари? Расширенные данные? Кто может задать направление мысли?
Цитата:
Сообщение от RNB Посмотреть сообщение
Пока в голову приходит только примитивный вариант - блок с атрибутами
Цитата:
Сообщение от roaa Посмотреть сообщение
Я как-то примеривался к таблице autocad...пока тормознул...не до этого... Противникам этого метода - было желание иметь все нужные данные в самом чертеже и визуально их контролировать.
Я имел в виду некую возможность без использования графических объектов, чтобы исключить заполнение свойств чертежа, которые могут понадобится пользователю для других целей. То есть по-максимуму сделать работу TextCellField похожей на работу встроенных полей. Думаю, что оптимальным тут будет алгоритм, подразумевающий использование словарей в связке с глобальными переменными. В словаре данные пусть хранятся от сеанса к сеансу, а при открытии чертежа значения из словарей будут передаваться переменным, которые, как известно, хранятся только в текущем сеансе. А на эти переменные будут ссылаться поля. Есть, правда, подозрения, что при очистке чертежа эти словари можно запросто потереть, не заметив, и тогда всем полям при перезагрузке КАДа наступит конец. Плюс для переделки, во-первых, пока совершенно нет времени, а во-вторых, останавливает то, что те пользователи, которые уже используют данную программу пострадают, поскольку изменится принцип, и те файлы, что уже работают по старому принципу либо придется переделать, либо, в программе предусмотреть возможность работоспособности обоих принципов, что в общем-то не проблема. Спрос у программы, правда небольшой, но он есть и обижать пользователей считаю последним делом. Это была одна из моих первых программ, поэтому все отнюдь не идеально.
Цитата:
Сообщение от perpetule Посмотреть сообщение
Вот это-то и обидно при наличии возможности автодеском не реализовано, а инструмент очень мощный -> вычисления в самом файле, омрачает ситуацию что автор таких вычислений с ними разберется, а вот сторонний пользователь вряд ли
Не совсем понял, о чем речь, что омрачает и какую ситуацию, но если речь о программе в шапке темы, то сторонний пользователь, имея представление о том, как пользоваться лиспом и прочитав инструкции в первом посте (загрузить файл и ввести TCF для вставки поля и UTCF для обновления) - разберется, не сомневаюсь, а если не разберется, то лишится и возможности использовать остальные сотни и тысячи уже готовых программ на лиспе.
Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Можно обойтись встроенными средствами!
Сначала было подумал, что можно обойтись встроенными средствами для создания полей, ссылающихся на текстовые значения ячеек таблицы Автокада, но потом понял, что речь идет о написанном постом выше - связке таблиц AutoCAD - Excel.
Цитата:
Сообщение от roaa Посмотреть сообщение
было желание иметь все нужные данные в самом чертеже и визуально их контролировать
Долго думал в свое время, как удобнее всего реализовать ввод исходных данных (текстовых и числовых) в проект с учетом того, что:
а) одни из них, такие как адрес или ФИО заказчика, нужно вписать от руки;
б) другие (оборудование, материалы) удобней выбрать из выпадающего списка допустимых значений;
в) над третьими, прежде чем использовать их в чертеже, нужно сначала произвести некоторые вычисления, причем часто те, которые не поддерживают таблицы в Автокаде,
г) часто исходные данные в процессе или по окончании проектирования могут измениться, и нужно с минимальными трудозатратами, ничего не забыв, заменить их по всему проекту, в том числе, и в текстовой части.
В итоге я пришел к тому, что ввод исходных данных организовал в Excel - он позволяет выполнить перечисленные условия в 99.9% случаев. Плюс появилась удобная возможность перенести все текстовые документы из Автокада, в котором автоматизация, например, пояснительной записки сопряжена с немалыми трудностями, да и не под это Автокад заточен. Далее таблица из Excel связывается с таблицей в Autocad, как указано Евгением двумя постами выше, а уже затем создаются поля со ссылкой на ячейки таблицы программой, выложенной в шапке темы.

Что мы в итоге имеем?
Один минус - появление в проекте связки AutoCAD<->Excel, со всеми вытекающими проблемами: обязанности таскать оба файла рядом, риск нарушения связи, и некоторые другие...
И плюсы:
- удобный ввод исходных данных,
- визуальное отображение всех исходных и вычисленных данных на чертеже в виде таблицы,
- удовольствие при внесении изменений в исходные данные, когда проект уже полностью готов, - одним кликом приводим все нужные значения в соответствие с данными в Excel,
- перенос текстовой части, в которой также фигурирует много исходных данных, из Автокада и более удобная работа с текстовыми и табличными документами в Excel.

Последний раз редактировалось skkkk, 17.01.2015 в 23:51. Причина: добавил пункт "г"
skkkk вне форума  
 
Непрочитано 17.01.2015, 19:41
#32
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
- удовольствие при внесении изменений в исходные данные, когда проект уже полностью готов, - одним кликом приводим все нужные значения в соответствие с данными в Excel,
Удовольствие - это главное!
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 17.01.2015, 23:51
#33
skkkk


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


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Удовольствие - это главное!
В общем-то да, учитывая, что удовольствие - это основа счастья, и вспоминая школу, хочу добавить: "Человек создан для счастья, как птица для полета..." (с) Короленко.
Хотелось бы узнать ваше, Евгений, мнение по поводу конструктивной части программы. Расскажите, пожалуйста, как бы вы поступили в данном случае? Где бы хранили данные? Или как бы предотвратили затирание словарей в процессе очистки? И вообще, что вы думаете по поводу решения данной задачи?
И еще: какой на ваш взгляд способ внесения в проект исходных данных самый оптимальный и удобный для пользователя?
skkkk вне форума  
 
Непрочитано 18.01.2015, 10:26
#34
VVA

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


Я тут почитал перспективы развития
Цитата:
Сообщение от skkkk Посмотреть сообщение
добавить возможность копирования поля сразу в буфер обмена;
Проблем никаких нет. Все необходимые функции здесь (бери те, что объектом объектом htmfile)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.01.2015, 13:47
#35
skkkk


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


VVA, спасибо. Честно говоря, не уделял еще внимания этому вопросу, в большей степени потому, что спросом не особо пользуется. Написал я эту возможность в качестве потенциальной, как одну из тех, которая логически напрашивалась и гипотетически могла бы кому-то понадобится для того, если поле надо вставить не изменяя весь существующий текстовый объект целиком, а в определенное место текстового объекта посредством Ctrl+V. Добавлю, пожалуй, на досуге, хотя б для того, чтоб не делать программу бесперспективной на корню . Осталось подумать, как и когда добавлять поле в буфер обмена: ультимативно сразу при указании ячейки-источника или только после того, как пользователь нажмет правой кнопкой мыши в ответ на запрос точки вставки поля или текстового объекта?
skkkk вне форума  
 
Непрочитано 18.01.2015, 22:19
#36
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от skkkk Посмотреть сообщение
Один минус - появление в проекте связки AutoCAD<->Excel
Если бы...Мало, что пишем под AutoCad, так еще и от Excell зависимость. А, если, у кого LibreOffice или OpenOffice...На мой взгляд, не совсем удачное решение.
roaa вне форума  
 
Автор темы   Непрочитано 19.01.2015, 01:04
#37
skkkk


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


Offtop: Ну Автокад у нас априори. Не скажу насчёт Libre, но в OpenOffice всё работает, даже макросы, с небольшими оговорками.
Я бы с радостью рассмотрел альтернативные варианты, но сколько ни думал, ничего лучше и удобней для пользователя придумать не смог. Однако, это вопрос для отдельной темы.
skkkk вне форума  
 
Непрочитано 21.01.2015, 15:19
#38
Avodo


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


Вообще супер, именно то что нужно!! очень долго мучились создавая отдельные таблицы из одной ячейки в тех местах где достаточно было вставить поле, которое ссылается на текстовую ячейку в таблице с расчетными данными... в одном файле получалось где то 10 связей, сейчас понадобилось около 30. Отличная программа, ничего лишнего и очень функционально!
Огромное СПАСИБО!!
Avodo вне форума  
 
Непрочитано 21.01.2015, 22:02 skkkk
#39
perpetule


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


Цитата:
Не совсем понял, о чем речь, что омрачает и какую ситуацию, но если речь о программе в шапке темы, то сторонний пользователь, имея представление о том, как пользоваться лиспом и прочитав инструкции в первом посте (загрузить файл и ввести TCF для вставки поля и UTCF для обновления) - разберется, не сомневаюсь, а если не разберется, то лишится и возможности использовать остальные сотни и тысячи уже готовых программ на лиспе.
Имеется ввиду что подавляющее большинство пользователей и обычные-то поля не знают (ступор), а тут поля еще вдобавок выглядят так же, но обновляться могут только программно - вывод, перед выдачей проекта их нужно сбросить.
Для сброса таких полей необходимо иметь возможность выделять поля именно этого вида, для этого нужно иметь возможность их отфильтровать от встроенных.

P.S. Меня не перестают удивлять энтузиасты функционал программ которых, превосходит функционал встроенный в продукт с ТАКОЙ стоимостью !!!
__________________
tc71
perpetule вне форума  
 
Автор темы   Непрочитано 21.01.2015, 22:20
#40
skkkk


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


Avodo, это хорошо, что понравилось, спасибо за добрые слова.
Цитата:
Сообщение от Avodo Посмотреть сообщение
в одном файле получалось где то 10 связей, сейчас понадобилось около 30
Не совсем понял, вроде стало лучше, но было 10 - стало 30??? Может, было 100?
Цитата:
Сообщение от perpetule Посмотреть сообщение
Для сброса таких полей необходимо иметь возможность выделять поля именно этого вида, для этого нужно иметь возможность их отфильтровать от встроенных.
Очень здравая мысль. Не приходила ко мне. Добавлю как-нибудь функцию для сброса этих полей.
Цитата:
Сообщение от perpetule Посмотреть сообщение
Меня не перестают удивлять энтузиасты
Спасибо, perpetule. Просто для меня это весьма и весьма увлекательно. И мало-помалу становится еще все более и более полезным.
skkkk вне форума  
 
Непрочитано 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,844


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,844


Кстати, пока не забыл: словари можно записывать и на объекты. Вроде бы они не уничтожаются чисткой. Даже если принудительно чистить словари 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,844


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

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


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

Цитата:
Сообщение от skkkk Посмотреть сообщение
А для Visual LISP это другой объект, для которого методы HitText и GetText не срабатывают
Наличие свойств можно проверить с помощью функции vlax-property-available-p
Миниатюры
Нажмите на изображение для увеличения
Название: spds.png
Просмотров: 104
Размер:	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 вне форума  
 
Непрочитано 23.10.2015, 12:39
#61
VVA

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
переписании функции get_cell_by_pick без использования метода HitTest, а также get_cell_value без GetText. Хотя, я сомневаюсь, что это вообще возможно
Да, это не возможно. Эти методы для этого и создавались.

Цитата:
Сообщение от RNB Посмотреть сообщение
И тут уже файл попадает к нам и мы делимся на 2 лагеря:
- у кого нет спдс-модуля - видят прокси-объект
- у кого есть - "Основную надпись".
на 99.99% так и есть
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 23.10.2015, 12:42
#62
skkkk


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


Offtop: RNB, видимо, на том компе, где я тестировал, СПДС все же установлен. Иначе я это объяснить не могу. Владелец им не пользуется (равно как и я, причем из-за таких вот проблем), он специально спросил сисадмина - тот не помнит. Да и в общем-то, не суть.

----- добавлено через ~17 мин. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
Да, это не возможно.
Что и требовалось доказать.
Проверил на своем 2011-м (точно без СПДС) - там эта "недотаблица" (или "пере-"?) видится как прокси, код работает, и при попытке ткнуть в нее код справедливо ругается, что это не таблица.
Так что для работоспособности кода при установленном СПДС встает лишь задача "отфильтровать" такие объекты прежде, чем подсовывать набор HitTest'у. VVA, подскажи, пожалуйста свои мысли, как это можно лучше сделать, учитывая, что они выбираются ssget'ом при фильтре (0 . "ACAD_TABLE")? Создавать набор через vla-методы? Или фильтровать на основе какого-либо свойства из дампа, приведенного мною тремя постами выше?
skkkk вне форума  
 
Непрочитано 23.10.2015, 13:48
#63
allrather


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
В одном из листов дополнительная графа является таблицей СПДС. При ее удалении начинает работать.
Извиняюсь за фейл.

Цитата:
Сообщение от skkkk Посмотреть сообщение
При этом владелец этой машины утверждает, что никакого СПДС он не ставил. Как это проверить? Не мог же он случайно поставиться? Или может, он поставил, да забыл? Мистика...
Ничего подобного я не утверждал.

Меня смутило
Цитата:
Сообщение от skkkk Посмотреть сообщение
в котором судя по всему СПДС уже внедрен в коробку
поэтому я и написал
Цитата:
Сообщение от allrather Посмотреть сообщение
СПДС не внедрен и слава Богу!
потому как не понимаю, как он, вообще, может быть внедрен!

Цитата:
Сообщение от RNB Посмотреть сообщение
Пользователь скопировал у кого-либо форматку. Как она определяется (прокси-объект или "Основная надпись") у этого пользователя мы не знаем (или я пропустил мимо глаз?).
Я осознанно пользуюсь СПДС и стремлюсь отказаться от него!

Цитата:
Сообщение от RNB Посмотреть сообщение
Интересует то, что он хапнул ошибку при выполнении лиспа.
+
allrather вне форума  
 
Автор темы   Непрочитано 23.10.2015, 14:10
#64
skkkk


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


Цитата:
Сообщение от allrather Посмотреть сообщение
Ничего подобного я не утверждал.
Я имел в виду того, на чьей машине с 2015-м Автокадом я проверял работу программы. Это он утверждал. У меня только 2011-й под рукой, и я решил не конвертировать файл в версию 2010, а по удаленке проверить у него. В итоге повезло, что у него стоит-таки СПДС, так как без него TCF работает, и сконвертировав в 2010-ю версию, я бы, наверное, долго у себя еще искал бы причину. В общем, по возможности постараюсь доработать код, надо только понять, как решить вопросы из моего предыдущего поста.
skkkk вне форума  
 
Непрочитано 23.10.2015, 16:32
#65
VVA

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
VVA, подскажи, пожалуйста свои мысли, как это можно лучше сделать
Если СПДСовские таблицы так же отбираются как ACAD_TABLE, то добавил фильтрацию по наличию/отсутствию метода 'HitTest
Но нужно проверить на машине с СПДС.
Цитата:
(vlax-method-applicable-p x 'HitTest) ;_Добавил 2015.10.23
Код:
[Выделить все]
;;--------------------------------------------------------
;; Функция получает ячейку таблицы по указанной точке
;; Если точка внутри таблицы, возвращает список вида (<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-method-applicable-p x 'HitTest) ;_Добавил 2015.10.23
								(= :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)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.10.2015, 17:41
#66
d.mOnII

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


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

----- добавлено через ~8 мин. -----
пока что решение проблемы можно сделать так: создаем текстовые поля в объектах многострочного текста при исполнении лисп.команды TCF (как промежуточные), а затем в атрибут блока вставляем текстовое поле со значением содержимого промежуточного объекта [многострочный текст, созданный при исполнении лиспа] и на выходе получаем блок с атрибутом и текстовым полем, который в качестве внешней ссылки отображается корректно
d.mOnII вне форума  
 
Непрочитано 25.11.2015, 15:04
#67
valrond


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


Потестил на 2015 автокаде, работает. Вопрос. Как бы сделать так, чтобы значение ячейки вставлялось в атрибут блока?
valrond вне форума  
 
Автор темы   Непрочитано 26.11.2015, 10:42
#68
skkkk


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


d.mOnII, valrond, работаю над этим сейчас, но катастрофически не хватает рук.
VVA, проверил на машине с СПДС - это то, что надо, чтобы отсеять таблицы НЕ Автокада. Внедрю обязательно в следующем выпуске.
Поскольку в то время, когда я собирал с помощью VVA куски кодов со всей Сети, я только начинал вникать в лисп, и объединить все эти коды в один у меня получилось достаточно дилетантским образом. Хотя программа и выполняет поставленные задачи, мне не очень нравится момент, который я придумал тогда. А именно, при запросе второй точки для вставки поля запрашивается именно точка, а не объект. Сейчас это решение мне кажется корявым. С одной стороны я тогда стремился к универсальности: кликнул в пустое место - создался текстовый объект с полем; кликнул на текстовый объект - поле добавилось в него; кликнул в ячейке - и поле там. Но с другой стороны, допустим, если работать в строительных чертежах, где все в мм (я чаще всего работаю на подосновах и там метры), то алгоритм по обработке второго запроса дает сбои. Но эти сбои я уже нашел, как обработать. Поскольку я и коллеги сами этим кодом уже давно не пользуемся ввиду использования более продвинутых технологий под наши нужды, прошу совета пользователей данного лиспа, а также всех у кого есть мысли на этот счет - высказаться на предмет того, стоит ли оставить эту универсальность второго клика или ввести две или три команды: одна будет вставлять на пустом месте, вторая - в таблицу (оба запроса - точки), третья - в текстовый объект, в т.ч атрибут (запрос на выбор объекта), четвертая, например, вставляла бы содержимое поля в буфер обмена, ведь не всегда надо менять все содержимое текстового объекта? Первую со второй, конечно, можно объединить, но тогда несколько нарушается логичность интерфейса. Есть еще третий вариант, тоже универсальный, в противопоставление первому: ультимативно при запросе второй точки или объекта вместо перекрестья - прямоугольник выбора - и при указании на пустое место или ячейку таблицы обработать это тоже достаточно просто.

На днях попытался обработать атрибуты своим корявым, но универсальным методом вставки поля в текстовый объект, но код не заработал. Кто сможет объяснить, почему конструкция
Код:
[Выделить все]
 ;_cond #2: при указании второй точки под курсором объект "ATTRIB"
  (	(and ;если под точкой в прямоугольнике с диагональю 6мм есть блок и он один
		(setq ss (ssget "_C" (polar pt2 (/ pi 4) 3) (polar pt2 (/ (* 5 pi) 4) 3) '((0 . "INSERT")))) 
		(= 1 (sslength ss))
		(setq vla-block-ref (vlax-ename->vla-object (ssname ss 0))
			  ins-pt (cdr (assoc 10 (entget (ssname ss 0))))
		)
	)
	(mapcar ;то щупаем, на какой  объект мы указали
		(function ;и если это атрибут, назначаем ему строку с полем
			(lambda (x) 
				(if (wcmatch (cdr (assoc 0 (entget (vlax-vla-object->ename x)))) "ATTRIB")
					(progn
						(vla-GetBoundingBox x 'MinP 'MaxP)
						(setq MinP (vlax-safearray->list MinP)
							  MaxP (vlax-safearray->list MaxP)
							  p1 (polar ins-pt (angle '(0.0 0.0 0.0) MinP) (distance '(0.0 0.0 0.0) MinP))
							  p3 (polar ins-pt (angle '(0.0 0.0 0.0) MaxP) (distance '(0.0 0.0 0.0) MaxP))
							  p2 (list (car p1) (cadr p3) 0.0)
							  p4 (list (car p3) (cadr p1) 0.0)
							  pt-list (list p1 p2 p3 p4)
						)
						(if (IsPtInside pt2 pt-list)(setq TargetObj x))
					)
				)
			)
		) 
		(get-block-entity-list vla-block-ref)
	)
	
	
	(vla-put-TextString TargetObj "-")
	(vla-put-TextString TargetObj str)
  ) ;_end of cond #2

- не срабатывает с атрибутами (комментарии в коде)? Если вместо атрибута там текст или мтекст - все в порядке, а с атрибутом - ни в какую! Пытался также с "ATTDEF" - результата нет. Поскольку основные использованные функции тут от Kpblc'а и VVA, то с вас основной спрос .
skkkk вне форума  
 
Непрочитано 26.11.2015, 11:30
#69
d.mOnII

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


если интересно и возможно реализовать, то как и в каде можно сделать:
вводится одна команда на создание поля
первое действие - выбираем объект из которого берем информацию (текст, ячейка таблицы и т.д.)
второе действие - по умолчанию ставится новый текст с полем, но есть возможность выбора (стрелками вверх/вниз вызывается контекстное меню) где пользователь выбирает нужную позицию и нажатием Ентер либо Пробел активирует дейсвие
ну а дальше ищет объект, который выбрал (атрибут либо ячейка таблицы и т.д.)
d.mOnII вне форума  
 
Непрочитано 26.11.2015, 11:35
#70
RNB

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


Цитата:
Сообщение от d.mOnII Посмотреть сообщение
если интересно и возможно реализовать, то как и в каде можно сделать:
вводится одна команда на создание поля
первое действие - выбираем объект из которого берем информацию (текст, ячейка таблицы и т.д.)
второе действие - по умолчанию ставится новый текст с полем, но есть возможность выбора (стрелками вверх/вниз вызывается контекстное меню) где пользователь выбирает нужную позицию и нажатием Ентер либо Пробел активирует дейсвие
ну а дальше ищет объект, который выбрал (атрибут либо ячейка таблицы и т.д.)
Offtop: Прям мои мысли доступным текстом. Хотел написать, не смог сформулировать, забил. Спасибо!
RNB вне форума  
 
Автор темы   Непрочитано 26.11.2015, 13:33
#71
skkkk


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


Цитата:
Сообщение от d.mOnII Посмотреть сообщение
первое действие - выбираем объект из которого берем информацию (текст, ячейка таблицы и т.д.)
Во-первых, ключевые слова в задаче данного топика:
Цитата:
Сообщение от skkkk Посмотреть сообщение
текстовое значение ячейки таблицы.
и лично я бы рекомендовал пользоваться где возможно все же стандартными полями, как более общедоступными и надежными. В новой версии, которая сейчас у меня на карандаше и которая подверглась серьезным изменениям, но еще не готова к выпуску, я обработал уже вариант, когда пользователь жмет ячейку, а в ней число, а не текст, то вставляется стандартное поле. Оно и понятно стремление многих воспользоваться TCF даже при наличии стандартной возможности - ведь для того, чтобы вставить поле стандартными средствами, необходимо сделать куда больше кликов. Тому, кто согласен со мной в этих рассуждениях, рекомендую попробовать quickfield от Lee Mac. Там используются штатные поля. Все же не хочется заниматься повторением имеющегося функционала.
Во-вторых, если даже мы все же решим, и я захочу добавить в обработку текстовые объекты, то как это сделать? Опять те же грабли: штатный автокадовский выбор ячейки таблицы - крестик и запрос точки, а выбор объекта - квадратик и запрос объекта. Впрочем, пока я склоняюсь к тому, чтобы обрабатывать только ячейки таблиц. Если есть желание и мысли как, то попробуйте меня переубедить.

Цитата:
Сообщение от d.mOnII Посмотреть сообщение
второе действие - по умолчанию ставится новый текст с полем, но есть возможность выбора (стрелками вверх/вниз вызывается контекстное меню) где пользователь выбирает нужную позицию и нажатием Ентер либо Пробел активирует дейсвие
С самого начала создания (точнее сборки) этой программы так я планировалось (в шапке упоминал). Только немного наоборот. Я хотел, чтобы текст с полем висел на курсоре, и реализация мне была знакома и доступна: либо вставка из буфера, либо вставка блока. Но при этом средствами лисп нет возможности обработать нажатие правой кнопки мыши или стрелки вниз. Поэтому я стал хотеть сделать, чтобы по умолчанию выбор объекта либо выбор точки, с возможностью по правой кнопке или стрелке вниз вываливать меню вроде:
  • Вставить в ячейку/в текстовый объект (в зависимости от того, какое "умолчание")
  • Новый текст (а также и варианты, вроде мтекст, мвыноска...)
  • Скопировать поле в буфер
  • Выход
, - однако подумал, что это добавит универсальности, но уменьшит удобство использования, и решил сделать так как сделано сейчас: запрос точки, если в прямоугольник диагональю 6 ед.чертежа вокруг нее попадает текстовый объект, то он модифицируется - меняется его содержимое, а если пусто - вставляется новый текст. Теперь я рассчитал, что крестик надо делать не 6мм, а брать функцию в зависимости от размеров экрана в текущем режиме приближения и от размера прицела. То есть указывая точку воображаем вокруг нее привычный квадрат. Можно попробовать так, должно обрабатываться корректно вне зависимости от единиц чертежа.

Итак, имеем варианты (пока принимаем, что первый запрос - точка, и она должна быть указана только внутри таблицы):
1. Второй запрос - тоже точка, курсор в форме крестика (то, как сейчас, но дошлифованное с учетом всех выявленных багов, в т.ч. обработка атрибутов).
2. Второй запрос - объект, курсор в форме квадрата. Если выбран текстовый объект (в т.ч. атрибут, конечно), он модифицируется, если клик внутри ячейки таблицы - вставка в ячейку, при этом вставится в ту ячейку, где был центр квадрата в момент клика. Если клик на пустом месте - вставка нового объекта, - в общем все как сейчас, отличие только в форме курсора при втором запросе.
3. Второй запрос - точка, курсор в форме крестика, правая кнопка вызывает меню
4. Второй запрос - точка, курсор в форме крестика, стрелка вниз вызывает меню
5. Второй запрос - объект, курсор в форме квадрата, правая кнопка вызывает меню
6. Второй запрос - объект, курсор в форме квадрата, стрелка вниз вызывает меню.

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

Прошу высказать мнения, по итогам я приплюсую к ним свое, продвинем вариант, одобренный большинством голосов.
skkkk вне форума  
 
Непрочитано 26.11.2015, 13:42
#72
RNB

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


2й или 5й.
Один вопрос, при вставке в аттрибут/текст/ячейку - будет заменять её содержимое или добавлять в начало/конец содержимого?

UPD. Исправлена опечатка (вместо 5го изначально написал 6й)

Последний раз редактировалось RNB, 27.11.2015 в 05:42.
RNB вне форума  
 
Автор темы   Непрочитано 26.11.2015, 14:41
#73
skkkk


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


Цитата:
Сообщение от RNB Посмотреть сообщение
при вставке в аттрибут/текст/ячейку - будет заменять её содержимое или добавлять в начало/конец содержимого?
По идее - меняется полностью - как сейчас, так я думал и оставить, таким же образом и атрибут хочу прикрутить. А для того, чтоб добавить в любое место имеющегося текста я придумал внедрить занесение поля в буфер обмена. Нетрудно сделать, чтоб добавлялось в конце. Но кому-то нужно будет в начале. А кому-то через пробел, кому-то через точку с запятой. Дабы угодить всем, придется делать дополнительные запросы, а при частой работе с командой они раздражают. А так - кликнул ячейку, отменил команду, ничего не вставляя, сделал двойной клик на тексте, вставил в нужное место курсор, Ctrl+V. Вот еще тут вопрос: делать ли независимо ни от чего занесение поля в буфер обмена или же сделать отдельную команду для этого? Которая сделает все то же, но еще и занесет поле в буфер? Или вообще отдельную команду, которая сначала спросит ячейку, а затем просто добавит поле в буфер, а может, и предложит выбрать текстовый объект, который откроет по одному щелчку, как _.DDEDIT. Правда как тут поступить с атрибутом - вопрос. Не знаю программного способа, как открыть его в редакторе, наподобие того, как он открывается при двойном клике с зажатым CTRL. В случае с принудительным добавлением поля в буфер есть вероятность, что пользователь будет ожидать другого содержимого буфера, который он наполнил этим содержимым до вызова TCF.

Последний раз редактировалось skkkk, 26.11.2015 в 14:46.
skkkk вне форума  
 
Непрочитано 27.11.2015, 05:58
1 | #74
RNB

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
По идее - меняется полностью - как сейчас, так я думал и оставить, таким же образом и атрибут хочу прикрутить. А для того, чтоб добавить в любое место имеющегося текста я придумал внедрить занесение поля в буфер обмена. Нетрудно сделать, чтоб добавлялось в конце. Но кому-то нужно будет в начале. А кому-то через пробел, кому-то через точку с запятой. Дабы угодить всем, придется делать дополнительные запросы, а при частой работе с командой они раздражают. А так - кликнул ячейку, отменил команду, ничего не вставляя, сделал двойной клик на тексте, вставил в нужное место курсор, Ctrl+V.
Согласен, так будет удобнее.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Вот еще тут вопрос: делать ли независимо ни от чего занесение поля в буфер обмена или же сделать отдельную команду для этого?
Думаю, будет удобно, если по умолчанию будет описанное выше, а копирование в буфер, допустим, из контекстного меню по правой кнопке мыши.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Не знаю программного способа, как открыть его в редакторе, наподобие того, как он открывается при двойном клике с зажатым CTRL.
_ATTIPEDIT
И небольшое лирическое отступление, о том, как я получил эту команду. Может пригодится кому. Когда мне нужно узнать команду, которой пользуется Автокад при двойном клике, или, как в этом случае, двойном клике с CTRL, я начинаю запись макроса и провожу указанные действия. Команды отражаются в макросе. Так я, например, выяснил команду редактирования текста мультивыноски.
RNB вне форума  
 
Непрочитано 30.12.2015, 14:42
#75
hardbringer


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


Скажите пожалуйста, что необходимо изменить в тексте программы TCF чтобы при выборе пустой ячейки таблицы выводить в текст не "----" а ""?
Или, если это невозможно, выводить те же "----", только с белым цветом шрифта?

Последний раз редактировалось hardbringer, 30.12.2015 в 14:57.
hardbringer вне форума  
 
Автор темы   Непрочитано 02.01.2016, 18:07
#76
skkkk


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


hardbringer, подобное поведение, когда при пустой ячейке поле принимает вид "----", зашито в ядре программы, и изменить его лиспом нельзя.
С белым цветом шрифта можно сделать, но это несколько неразумно на мой взгляд. Как менять цвет обратно на черный, когда ячейка перестанет быть пустой? Вручную? Или назначать реактор на изменение таблицы? Не нравятся мне эти варианты.
Предлагаю иное решение. Если указанная ячейка-источник окажется пустой, то добавить в нее пробел (программно). Правда при этом поле "потеряется", точнее, текстовый объект, в котором оно находится, если в нем содержится только это поле и более ничего, пропадет из вида, и его нельзя будет выбрать мышкой. Аналогично тому, как если бы в мтексте оставить один пробел. При этом можно добавить скрытие заднего плана этого текстового объекта и цвет фона назначить 255,255,255 - то есть белый на печати. Тогда этот текстовый объект можно будет выбирать и редактировать. Попробуйте, если устроит такой вариант, сделаю.
skkkk вне форума  
 
Непрочитано 03.01.2016, 13:03
#77
allrather


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
В новой версии, которая сейчас у меня на карандаше и которая подверглась серьезным изменениям, но еще не готова к выпуску, я обработал уже вариант, когда пользователь жмет ячейку, а в ней число, а не текст, то вставляется стандартное поле. Оно и понятно стремление многих воспользоваться TCF даже при наличии стандартной возможности - ведь для того, чтобы вставить поле стандартными средствами, необходимо сделать куда больше кликов. Тому, кто согласен со мной в этих рассуждениях, рекомендую попробовать quickfield от Lee Mac. Там используются штатные поля. Все же не хочется заниматься повторением имеющегося функционала.
quickfield от Lee Mac - хорошая штука. Но, реально, было бы круто, чтобы в tcf была возможность создания и стандартного числового поля. Как я понял, скоро она появится? Когда, если не секрет?
Цитата:
Сообщение от skkkk Посмотреть сообщение
Во-вторых, если даже мы все же решим, и я захочу добавить в обработку текстовые объекты, то как это сделать? Опять те же грабли: штатный автокадовский выбор ячейки таблицы - крестик и запрос точки, а выбор объекта - квадратик и запрос объекта. Впрочем, пока я склоняюсь к тому, чтобы обрабатывать только ячейки таблиц.
Думаю, что и не надо они. Работа с ячейками таблицы и все. Зачем перебарщивать? Тут можно еще придумать миллион опций, которыми никто не будет пользоваться, и код будет писаться всю жизнь.
Цитата:
Сообщение от RNB Посмотреть сообщение
_ATTIPEDIT
И небольшое лирическое отступление, о том, как я получил эту команду. Может пригодится кому. Когда мне нужно узнать команду, которой пользуется Автокад при двойном клике, или, как в этом случае, двойном клике с CTRL, я начинаю запись макроса и провожу указанные действия. Команды отражаются в макросе. Так я, например, выяснил команду редактирования текста мультивыноски.
Делаю точно так же. Брат
allrather вне форума  
 
Непрочитано 04.01.2016, 09:52
#78
hardbringer


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Предлагаю иное решение. Если указанная ячейка-источник окажется пустой, то добавить в нее пробел (программно). Правда при этом поле "потеряется", точнее, текстовый объект, в котором оно находится, если в нем содержится только это поле и более ничего, пропадет из вида, и его нельзя будет выбрать мышкой. Аналогично тому, как если бы в мтексте оставить один пробел. При этом можно добавить скрытие заднего плана этого текстового объекта и цвет фона назначить 255,255,255 - то есть белый на печати. Тогда этот текстовый объект можно будет выбирать и редактировать.
При таком варианте решения, в случае изменения значения ячейки таблицы с пустого на непустое при обновлении значений полей командой UTCF отобразится ли в поле новое значение?

upd. И как это сделать не подскажите?

Последний раз редактировалось hardbringer, 13.01.2016 в 17:22.
hardbringer вне форума  
 
Автор темы   Непрочитано 20.01.2016, 19:03
#79
skkkk


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


Цитата:
Сообщение от allrather Посмотреть сообщение
quickfield от Lee Mac - хорошая штука. Но, реально, было бы круто, чтобы в tcf была возможность создания и стандартного числового поля. Как я понял, скоро она появится? Когда, если не секрет?
Уже почти готова эта версия, но еще не все ошибки отловил. Надеюсь, в скором времени дойдут руки.
Цитата:
Сообщение от hardbringer Посмотреть сообщение
При таком варианте решения, в случае изменения значения ячейки таблицы с пустого на непустое при обновлении значений полей командой UTCF отобразится ли в поле новое значение?
Конечно, отобразится новое значение. Иначе какой во всем этом смысл?
Цитата:
Сообщение от hardbringer Посмотреть сообщение
И как это сделать не подскажите?
Боюсь, подсказать тут не получится, поскольку там вопрос не простой замены пары символов в коде, но внедрить эту возможность в ближайшее время также постараюсь. Вот только добавлять ли программно такому тексту белый фон? Убирать его в случае нужды после придется вручную. Или оставить без фона, и тогда одиночный мтекст, содержащий такое поле нельзя будет выбрать мышкой?
skkkk вне форума  
 
Непрочитано 21.01.2016, 08:46
#80
perpetule


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


Цитата:
Вот только добавлять ли программно такому тексту белый фон
Если добавлять то цвет Мтекста желательно принудительно менять, например один из немногих - цвет 20
одинаково хорошо читается и у тех кто работает на белом фоне, и утех кто на темном.
__________________
tc71
perpetule вне форума  
 
Автор темы   Непрочитано 21.01.2016, 14:28
#81
skkkk


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


perpetule, с точки зрения универсальной видимости - да, но ведь этот цвет будет выводиться на печать. Думаю, за такое юзеры спасибо не скажут. Тут, я так понимаю, смысл в том, чтобы при пустой ячейке поле, ссылающееся на нее, оставалось пустым до того, как в ячейке не появится текстовое значение. А раз черточки поля (----) при ссылке на пустую ячейку не устраивают, то, предположительно, и фон тут будет лишним на бумаге.
skkkk вне форума  
 
Непрочитано 21.01.2016, 16:49
#82
hardbringer


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Боюсь, подсказать тут не получится, поскольку там вопрос не простой замены пары символов в коде, но внедрить эту возможность в ближайшее время также постараюсь. Вот только добавлять ли программно такому тексту белый фон? Убирать его в случае нужды после придется вручную. Или оставить без фона, и тогда одиночный мтекст, содержащий такое поле нельзя будет выбрать мышкой?
А возможно ли сделать следующим образом: скажем, при отсутствии данных в исходной ячейке автоматически поменять цвет выводимого текста на белый, но при обновлении связи организовать проверку, которая бы меняла цвет на черный при появлении в ячейке значения непустого значения. То есть проверять все значения на "непустоту" и корректировать цвет текста?
Если так получится сделать, это будет просто шикарно.
hardbringer вне форума  
 
Непрочитано 22.01.2016, 10:33
#83
perpetule


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


Цитата:
perpetule, с точки зрения универсальной видимости - да, но ведь этот цвет будет выводиться на печать
Вся множительная техника за разумные деньги Ч/Б, что фактически означает запрет использовать цвет для условных обозначений.
P.S. Все сказанное ИМХО, холивар по этому поводу излишен.
Холивар или холивор (от англ. holy war, «священная война»)
__________________
tc71
perpetule вне форума  
 
Непрочитано 18.04.2016, 11:19
#84
quazi


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


Очень годный лисп.
Кому не нравятся черточки, то проще пробелы вводить в исходную таблицу.
Посоветуйте способ как весь этот огород (исходная таблица, польз. поля и наконец мои блоки в атрибутах котрых ссылки на эти поля) скопировать в другой файл с сохранением связей.
При копировании только элементов чертежа поля не перенесутся и поменяется handle таблицы. У меня одна большая таблица, всего полей 200 получится.
Что можно придумать?
quazi вне форума  
 
Непрочитано 18.04.2016, 11:22
#85
RNB

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


Сохранить как...
RNB вне форума  
 
Непрочитано 18.04.2016, 16:15
#86
quazi


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


RNB, мда...
Может подскажет кто-то как сделать поиск с заменой по всем field expression в чертеже?
Где то тут советовали использовать редактор из vetcad, но у меня не сработало.

И еще: как победить знаки вопроса вместо символов куба, квадрата? (00B2, 00B3)

Последний раз редактировалось quazi, 18.04.2016 в 17:17.
quazi вне форума  
 
Непрочитано 18.04.2016, 19:03
#87
VVA

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


Цитата:
Сообщение от quazi Посмотреть сообщение
как победить знаки вопроса вместо символов куба, квадрата? (00B2, 00B3)
В текстовом стиле поменять шрифт на "понимающий" символы куба и квадрата
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.04.2016, 19:23
#88
quazi


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


VVA, эти символы есть в шрифте, теряются они при переносе содержимого ячейки таблицы в пользовательское свойство чертежа, уже в свойстве получаются вопросы.
Если руками создать свойство и вписать в него любой символ, то поле ссылающееся на это свойство будет нормально отображать весь юникод, как минимум эти символы.
quazi вне форума  
 
Непрочитано 18.04.2016, 20:52
#89
Кулик Алексей aka kpblc
Moderator

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


Я поражаюсь... Тема вроде вообще не о пользовательских свойствах чертежа.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.10.2016, 10:50
#90
pobat

инжинириг
 
Регистрация: 26.01.2012
Сообщений: 20


А чисто технически можно ли ссылаться не на таблицу а другой mtext ?
pobat вне форума  
 
Непрочитано 28.10.2016, 12:29
#91
allrather


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


Цитата:
Сообщение от pobat Посмотреть сообщение
А чисто технически можно ли ссылаться не на таблицу а другой mtext ?
Это возможно даже чисто AutoCADически!
Нажмите на изображение для увеличения
Название: Screen Shot 001.PNG
Просмотров: 152
Размер:	35.1 Кб
ID:	178339
allrather вне форума  
 
Непрочитано 07.11.2016, 15:32
#92
pobat

инжинириг
 
Регистрация: 26.01.2012
Сообщений: 20


Цитата:
Сообщение от allrather Посмотреть сообщение
Это возможно даже чисто AutoCADически!
Вложение 178339
спасибо за ответ!
Я имел ввиду в один клик,
выделить любой текст, а далее при кликании любого другого текста вставлялось поле (ссылка) на первый выеденный
pobat вне форума  
 
Автор темы   Непрочитано 07.11.2016, 18:47
#93
skkkk


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


pobat, у Lee Mac'а есть такая программа - Quick Field (ссылка вверху страницы на lsp-файл).

Цитата:
Сообщение от pobat Посмотреть сообщение
выделить любой текст, а далее при кликании любого другого текста вставлялось поле (ссылка) на первый выеденный
Загружаем в кад лисп Quick Field, а затем еще и этот кусочек кода (можно добавить в конец Quick Field):
Код:
[Выделить все]
(defun c:test ( ) (LM:QuickField "TextString" "" 1))
skkkk вне форума  
 
Непрочитано 29.11.2016, 12:22
#94
greyser


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


приветствую!
а как эту прогу (как функцию или подпрограмму) использовать для копирования значения определенных содержимого ячеек строки одной таблицы и вставки в определенное поле ячейки другой таблицы. для лучшего понимания прикладываю dwg.
Алгоритм такой: из таблицы извлечения данных смотрим на ячейку 1 столбца строки N и по значению этой ячейки выбираем поля в таблице спецификации, куда копировать содержимое ячеек строки. Прогоняем все строки и увеличиваем кол-во в спецификации по мере продвижения вниз по таблице извлечения данных. Надеюсь, понятно пояснил.
Вложения
Тип файла: dwg
DWG 2010
пример.dwg (630.8 Кб, 39 просмотров)
greyser вне форума  
 
Автор темы   Непрочитано 29.11.2016, 14:00
#95
skkkk


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


greyser, боюсь, что воплощение подобного алгоритма потребует в разы (если не в десятки раз) больше кода, чем сама эта прога (TCF).
Во-первых, TCF не приспособлена для вставки поля в часть ячейки таблицы - она заменит полностью содержимое ячейки. Думаю, тут лучше писать все с нуля, возможно, используя некоторые куски кода из TCF, если там действительно будет необходимость ссылаться на текстовые ячейки таблицы.
Во-вторых, алгоритм нужно прорабатывать куда более серьезно, чем поместить его в три строки текста, как в #94. И делать это должен, скорее всего, сам программист, который сможет взяться за это. При этом он должен основательно вникнуть в рабочий процесс, и скорее всего научить пользователей делать работу по-новому, так, как это будет необходимо программе - ни шага в сторону. По опыту могу сказать, что если это и реально, то стоить будет очень недешево.
skkkk вне форума  
 
Непрочитано 29.11.2016, 14:34
#96
greyser


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
greyser, боюсь, что воплощение подобного алгоритма потребует в разы (если не в десятки раз) больше кода, чем сама эта прога (TCF).
Во-первых, TCF не приспособлена для вставки поля в часть ячейки таблицы - она заменит полностью содержимое ячейки. Думаю, тут лучше писать все с нуля, возможно, используя некоторые куски кода из TCF, если там действительно будет необходимость ссылаться на текстовые ячейки таблицы.
Во-вторых, алгоритм нужно прорабатывать куда более серьезно, чем поместить его в три строки текста, как в #94. И делать это должен, скорее всего, сам программист, который сможет взяться за это. При этом он должен основательно вникнуть в рабочий процесс, и скорее всего научить пользователей делать работу по-новому, так, как это будет необходимо программе - ни шага в сторону. По опыту могу сказать, что если это и реально, то стоить будет очень недешево.
пользователь я один и это намного облегчает задачу =). с точки зрения дилетанта задача не видится такой драматично сложной, придется самому осваивать программирование. мой вопрос, конечно же, не был просьбой сделать программу, скорее нужен совет, куда бежать. наверняка есть какие-то готовые программы, которые можно скрестить с TCF для решения задачи
greyser вне форума  
 
Автор темы   Непрочитано 29.11.2016, 16:43
#97
skkkk


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


Цитата:
Сообщение от greyser Посмотреть сообщение
наверняка есть какие-то готовые программы, которые можно скрестить с TCF для решения задачи
Это сильно вряд ли. Если только кто-то из подобного рода деятелей не пошел по тому же пути и не изобрел нечто похожее на то, что нужно.
Цитата:
Сообщение от greyser Посмотреть сообщение
скорее нужен совет, куда бежать
Offtop: Думаю, я бы в данном случае не связывался с полями. И с извлечением данных - тоже. Анализировал бы нужным образом схему, составляя по результатам анализа структурированный список,который содержал бы списки строк в количестве, равном числу столбцов. А затем эти строки из списка загонял бы программно в таблицу.
skkkk вне форума  
 
Непрочитано 09.02.2017, 19:36
#98
ackye


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


Всем добрый вечер. Про лисп узнал сегодня, так что пожалуйста не ругайте, если туплю.
У меня есть следующая задача. В эксель таблицу вводятся числовые и текстовые данные. Таблицу я загрузил в модель када, и теперь данные при изменении в эксель меняются в кадовской табличке (после обновления связи). На чертеже у меня есть текстовые поля, которые должны брать текст из таблички. После курения интеренета, я понял что так просто расставлять текст по чертежу из таблички не выйдет и попал в эту тему. Загрузил данный лисп скрипт в кад и при наборе команды textcellfield выходит сообщение нет определения функции: vla-endundomark. У меня есть подозрения, что я что-то делаю не так а может и вовсе пишу не в ту тему. Поясните пожалуйста.
ackye вне форума  
 
Автор темы   Непрочитано 09.02.2017, 23:24
#99
skkkk


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


Цитата:
Сообщение от ackye Посмотреть сообщение
выходит сообщение нет определения функции: vla-endundomark
Это странно, поскольку (vl-load-com) - функция, подгружающая Visual LISP, в коде присутствует. Похоже на какой-то сбой в системе AutoCAD, слышал о таком, но нечасто.
Какая версия AutoCAD? Нет ли возможности попробовать на других машинах с той же версией?
skkkk вне форума  
 
Непрочитано 10.02.2017, 10:02
#100
ackye


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


skkkk, большое спасибо. На другом компе с той же версией када (2014 на Windows 7) все заработало. А у меня на Win8 не хочет. Попробую поставить другую версию Автокад.
ackye вне форума  
 
Непрочитано 08.05.2017, 00:09 Глюк при печати внешней ссылки с полем по TCF
#101
d.mOnII

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


добрый день.
При вставке текстового поля данным лиспом из таблицы возникает слдующая проблема:
1. при вставке в файл внешней ссылки, в которой присутствует данное поле, в конечном файле это поле не отражается, точнее отражается как ###
2. пробовал решить проблему промежуточным элементом с текстовым полем, в итоге пи вставке внешней ссылки в конечном файле видно следующее:
текстовое поле первое отражается как ###, второе текстовое поле со ссылкой на первое отражается корректно в автокаде, но при печати в ПДФ - снова ###
скрины во вложениях.
Миниатюры
Нажмите на изображение для увеличения
Название: Шаг1_ИсходныйФайл_МодельИсходногоФайла-ВнешнейСсылки.JPG
Просмотров: 177
Размер:	64.1 Кб
ID:	187622  Нажмите на изображение для увеличения
Название: Шаг2_ВыхФайл_ПространствоЛистаАналогичноМодель.JPG
Просмотров: 143
Размер:	87.4 Кб
ID:	187623  Нажмите на изображение для увеличения
Название: Шаг3_ВыхФайл_ПросмотрПечатиDWGtoPDF.JPG
Просмотров: 141
Размер:	72.5 Кб
ID:	187624  Нажмите на изображение для увеличения
Название: Шаг4_ВыхФайл_ФайлПДФприПечатиDWGtoPDF.JPG
Просмотров: 129
Размер:	67.7 Кб
ID:	187625  
d.mOnII вне форума  
 
Непрочитано 08.05.2017, 14:58
#102
Avodo


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


Выражаясь простым языком (профи поправят) поля созданные этим лиспом берут информацию из текущего файла, не совсем как хотелось бы по логике, но вот так. Продумайте другой алгоритм работы, возможно сделать таблицу в Экселе и во все файлы загрузить ее через диспетчер связей. Далее следите чтоб все поля TCF напрямую ссылались на таблицу...
Скорее всего вы закидываете все файлы в один как внешние ссылки для автоматической печати? думаю можно придумать вариант с печатью другим способом, например попробуйте Диспетчер подшивок.
Avodo вне форума  
 
Непрочитано 10.05.2017, 12:27
#103
d.mOnII

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


Цитата:
Сообщение от Avodo Посмотреть сообщение
Продумайте другой алгоритм работы, возможно сделать таблицу в Экселе и во все файлы загрузить ее через диспетчер связей. Далее следите чтоб все поля TCF напрямую ссылались на таблицу...
Скорее всего вы закидываете все файлы в один как внешние ссылки для автоматической печати? думаю можно придумать вариант с печатью другим способом, например попробуйте Диспетчер подшивок.
закидываю ссылки в один, но не для автопечати, а это принцип формирования файлов проекта и работать подшивками тут не вариант.
Тем не менее для решения вопроса либо отрегулировать печать текстового поля из внешней ссылки либо вовсе отказаться от TCF и печатать ручками.
тут, учитывая что все же отражение текстового поля во внешней ссылке можно добиться путем промежуточного объекта (внесенного на дефпоинт) с текстовым полем, необходимо как-то сделать что бы отражающие символы все же пропечатывались в ПДФ. (ведь несколько странно, что, отражаясь в модели, не печатаются в ПДФ)

поэкспериментировал с атрибутами, но один фиг - только символы ###

Последний раз редактировалось d.mOnII, 10.05.2017 в 13:26.
d.mOnII вне форума  
 
Непрочитано 19.03.2018, 14:30
#104
Okl


 
Регистрация: 14.03.2018
Сообщений: 11
Отправить сообщение для Okl с помощью Skype™


Спасибо эту программу!!))) Очень полезное решение!))) Все установилось и работало на отлично... но после того как я закрыл Автокад и заново открыл, поля перестали работать((( в чем проблемма? подскажите пожалуйста...
Okl вне форума  
 
Автор темы   Непрочитано 20.03.2018, 02:45
#105
skkkk


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


Может, надо загрузить код а автокад? Добавить в автозагрузку? Поиск по словам "как использовать лисп".
skkkk вне форума  
 
Непрочитано 20.03.2018, 07:54
#106
Кулик Алексей aka kpblc
Moderator

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


Что значит "поля перестали работать", интересно? А если вручную создать поле - оно тоже перестает работать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.04.2018, 17:54
#107
zRaFiNaDz


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


Отличнейший lisp, очень помог при автоматизации в проектах - сейчас очень много проектов КЖ к примеру, где меняются отметки, геология, длина свай, название объекта, шифр. Проект для меня с использованием этого лиспа - заполнить табличку в Екселе (10 минут), поправить геологический разрез (10 минут) и все "ЭКСПОРТПДФ". Огромное спасибище авторам!!!!
zRaFiNaDz вне форума  
 
Непрочитано 22.05.2018, 06:49
#108
zRaFiNaDz


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


Доброго времени суток всем.
Уже сделал порядка 50-60 проектов используя этот лисп. Но тут столкнулся с проблемой - в файле-доноре (образце) все работало как часы. Взяв этот файл за основу - сменил в екселе текст в ячейках, все обновилось. Но после какого-то момента - начались проблемы. при вводе команды UTCF - автокад выдает ошибку: "Команда: UTCF; ошибка: неверный тип аргумента: lentityp nil", и часть полей в тексте и таблицах обновляется, а часть нет. С чем связана ошибка ума не приложу, проверка и очистка чертежа не помогают. К сожалению проект выложить не могу (конфиденциальность - поля не меняются, так бы ересь какую-нибудь бы вбил и выложил), если кто готов помочь - скину в личку. Заранее спасибо!
zRaFiNaDz вне форума  
 
Автор темы   Непрочитано 24.05.2018, 09:30
1 | #109
skkkk


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


Скиньте мне файл на почту через мой профиль. В личке файлы не прикладываются.

----- добавлено через ~6 ч. -----
zRaFiNaDz, перезалил файл в первом посте. Ошибку вызывал тот факт, что несколько таблиц, на которые ссылались поля, были удалены из чертежа. Не найдя их, программа удивлялась и отваливалась. Ошибку устранил, заодно добавил чистку ненужных свойств чертежа. При первом запуске UTCF в приложенном файле в комстроке будет выведен отчет о том, скольких и каких таблиц не хватает (указана малоинформативная для пользователя метка объекта-таблицы в базе данных чертежа)
skkkk вне форума  
 
Непрочитано 06.11.2018, 11:01
#110
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


Цитата:
Сообщение от zRaFiNaDz Посмотреть сообщение
Доброго времени суток всем.
Уже сделал порядка 50-60 проектов используя этот лисп. Но тут столкнулся с проблемой - в файле-доноре (образце) все работало как часы. Взяв этот файл за основу - сменил в екселе текст в ячейках, все обновилось. Но после какого-то момента - начались проблемы. при вводе команды UTCF - автокад выдает ошибку: "Команда: UTCF; ошибка: неверный тип аргумента: lentityp nil", и часть полей в тексте и таблицах обновляется, а часть нет. С чем связана ошибка ума не приложу, проверка и очистка чертежа не помогают. К сожалению проект выложить не могу (конфиденциальность - поля не меняются, так бы ересь какую-нибудь бы вбил и выложил), если кто готов помочь - скину в личку. Заранее спасибо!
У этой программы ограниченное количество полей... каждый год имеет свой рандомный номер... есть хоть и бесконечно малая но вероятность того что рандомный код совпадет с предыдушим...
__________________
Вечность это:
 (while T)
OKJI вне форума  
 
Автор темы   Непрочитано 06.11.2018, 12:07
#111
skkkk


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


Он имеет не рандомный номер, а строку, состоящую из хэндла таблицы и номера ячейки. В пределах одного чертежа не может быть таблиц с одинаковым хэндлом.
skkkk вне форума  
 
Непрочитано 06.11.2018, 12:57
#112
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
Он имеет не рандомный номер, а строку, состоящую из хэндла таблицы и номера ячейки. В пределах одного чертежа не может быть таблиц с одинаковым хэндлом.
Разве такого рода шифрование не может дать одинаковую последовательность символов для разных чисел?


----- добавлено через 44 сек. -----
зачем вообще эта шифровка идет?
__________________
Вечность это:
 (while T)
OKJI вне форума  
 
Автор темы   Непрочитано 09.11.2018, 13:38
#113
skkkk


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


Это не шифровка. Я использовал эту функцию, найденную в Сети лишь для того, чтобы преобразовывать номер столбца из цифры в букву и обратно.
Код:
[Выделить все]
Команда: (Number2Alpha 1)
"A"
Команда: (Number2Alpha 2)
"B"
Команда: (Number2Alpha 3)
"C"
Команда: (Number2Alpha 26)
"Z"
Команда: (Number2Alpha 27)
"AA"
skkkk вне форума  
 
Непрочитано 19.02.2019, 01:45
#114
aspel


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


skkkk, а может есть возможность добавить ввод имени (а не авоматическое присвоение имения в виде Table<handle таблицы>_<адрес ячейки>)в свойствах чертежа (команда _dwgprops), во вкладке Прочее (Custom) псоле выборя ячейки из таблицы
aspel вне форума  
 
Непрочитано 22.02.2019, 00:43
#115
Barmaley Bubusikin


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


skkkk, хочется чтобы неразрывный пробел оставался невидимым, а не превращался в \~.
Barmaley Bubusikin вне форума  
 
Непрочитано 20.09.2019, 23:23
#116
Куинбус Флестрин


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


Уважаемый skkkk, простите за дилетантский вопрос: Возможно ли написать макрос для работы с Вашей командой TCF, чтобы он бесконечно повторялся (с префиксом *) и с из команды выходом по Esc.
Куинбус Флестрин вне форума  
 
Автор темы   Непрочитано 23.09.2019, 13:10
#117
skkkk


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


Куинбус Флестрин, надо добавить в код (в самое начало) вот эту строку:
Код:
[Выделить все]
(defun C:CTCF ( / ) (while T (C:TextCellField)))
Вызывать соответственно CTCF или (C:CTCF).
Проверил на 2011.
skkkk вне форума  
 
Непрочитано 15.10.2019, 23:09
#118
Barmaley Bubusikin


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


Уважаемый автор, если в ячейке таблицы есть неразрывный пробел, то в поле, которое ссылается на эту ячейку, он отображается как \~. Это лечится?
Barmaley Bubusikin вне форума  
 
Автор темы   Непрочитано 16.10.2019, 20:44
#119
skkkk


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


Barmaley Bubusikin, это вряд ли. Такая штука заложена в самом Автокаде. Если сделать поле со ссылкой на содержимое текста, например, то будет то же самое.
skkkk вне форума  
 
Непрочитано 02.03.2020, 16:47
#120
mr.frai1992


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


skkkk, присоединяюсь к вышеперечисленным благодарностям! Очень хорошая и нужная программа получилась!
Р.S. Может я невнимательно прочитал что-то или не так делаю... С атрибутами блоков пока не получилось?
mr.frai1992 вне форума  
 
Непрочитано 17.12.2020, 19:17
#121
Kris_pr


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


Приветствую!
Как я заметила, ссылка на ячейку содержит название таблицы. Можно ли как так сделать, чтобы ссылка была на "свою" таблицу?
Я сделала таблицу со ссылками на ячейку, дальше я хочу сделать кучу копий этой таблицы, где информация в ячейке, на которую ссылаюсь, отличается от исходной таблицы. Сейчас все копии ссылаются на изначальную первую таблицу, а хотелось бы чтобы ссылка была на ячейку копии. Каждый раз обновлять ссылки для меня не имеет смысла, по времени это выйдет так же, как если бы я просто руками освежала нужные данные.
Kris_pr вне форума  
 
Автор темы   Непрочитано 24.12.2020, 15:21
#122
skkkk


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


Kris_pr, вряд ли такое удастся сделать. Как вариант могу порекомендовать делать каждую таблицу с "её" полями в отдельном файле и использовать подшивку.
skkkk вне форума  
 
Непрочитано 24.12.2020, 15:36
#123
v.psk

конструктор
 
Регистрация: 14.08.2014
Псков
Сообщений: 7,113


Ну так копируйте поле вместе с таблицей, связь должна унаследоваться.

----- добавлено через ~3 мин. -----
Для обычных полей сработает.... Если нет -копировать пару (через буфер обмена) и вставить.
v.psk вне форума  
 
Автор темы   Непрочитано 24.12.2020, 16:39
#124
skkkk


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


v.psk, не, в моем костыле такое не прокатывает)
skkkk вне форума  
 
Непрочитано 25.03.2022, 09:53
#125
shmulka

Инженер-электрик
 
Регистрация: 08.08.2013
Нижний Новгород
Сообщений: 131


Добрый день. Вопрос не совсем по данной программе, но по данной тематике)) Можно ли как-то автоматизировать стандартную вставку ссылки на ячейку по ПКМ? Скажем макросом. Чтобы в 1 клик было. И повесить на кнопку или ещё что-то. Просто очень часто и мнорго использую для связки кабельного жруналп и принципиалок, а стандартная вставка по ПКМ отнимает много времени при больших объёмах. Пробовал команду EDITTABLECELL, но не получается

Последний раз редактировалось shmulka, 25.03.2022 в 10:09.
shmulka вне форума  
 
Непрочитано 28.06.2023, 14:00
#126
posetitel


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


уважаемый skkkk, возможно ли допилить лисп так, чтобы можно было просто значение текста (числа) из чертежа отправлять в свойства файла минуя вставку в выноску, и также вставлять полем из свойств?
смысл действия: создать связь разных файлов чертежей через свойства файла, которые отдельным лиспом копировать.
ну, например, в первом файле у меня идет спецификация с порядковыми номерами позиций, а во втором файле чертеж детали, в названии которой указана позиция этой детали в общей спецификации. когда создаю спецификацию, все номера отправляю с помощью лиспа в свойства файла, потом эти свойства копирую в файлы с чертежами деталей и в каждом файле с деталью уже беру нужное поле. как только изменится номер позиции в спецификации я свойства файла спецификацией перенесу в другие файлы и обновлю чертежи.
posetitel вне форума  
 
Автор темы   Непрочитано 29.06.2023, 18:53
#127
skkkk


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


posetitel, не совсем понял. Нужно просто быстрая вставка поля со ссылкой на свойство чертежа?

Цитата:
Сообщение от posetitel Посмотреть сообщение
вставлять полем из свойств
Вроде того:
1. Запускаем лисп
2. Выпадает список всех свойств чертежа
3. Выбираем нужное
4. На курсоре висит поле.


Цитата:
Сообщение от posetitel Посмотреть сообщение
значение текста (числа) из чертежа отправлять в свойства файла
Выбираем текстовый объект, его значение отправляется в свойства чертежа? А с каким именем свойства?
Так я понял?

В общем, ТЗ пока на четвёрочку с минусом)
И боюсь, нас за такое поругают. Лучше создать отдельную тему, ибо тут всё же о таблицах.
Сделать такое несложно, кодов для работы со свойствами есть немало даже тут, на форуме.
skkkk вне форума  
 
Непрочитано 29.06.2023, 20:55
#128
posetitel


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


skkkk, давайте порассуждаем тут в рамках темы, думаю, все же это не будет оффтопом и строгий админ не накажет.
Итак.
В лиспе значение текста из ячейки записывается в переменную, которая сохраняется в свойствах чертежа. Это очень интересное решение, раньше такого вроде не встречал, все происходило через буфер обмена либо через какую-то внутреннюю лисповскую переменную, т.е. нигде не сохранялось значение для возможности дальнейшего использовался.
Так вот, раз у нас в чертеже появляется переменная со значением из таблицы, то почему бы и дальше эту переменную не использовать. Как варианты использования как вы ранее писали, можно сделать повторный вызов списка переменных и выбирать, какую конкретно вставить в поле, т.е. если надо сделать две выноски со значением из одной ячейки таблицы, чтобы не плодить переменные просто использовать уже ранее сохраненную.
Когда писал предыдущее сообщение, то не совсем верно понимал принцип работы лиспа, в переменную копируется не значение из ячейки, а адрес этой ячейки в таблице, т.е. если перед ячейкой вставить строку или столбец, то все ссылки на эту ячейку собьются, т.к. по адресу ссылки будет уже новая вставленная строка или столбец.
posetitel вне форума  
 
Автор темы   Непрочитано 30.06.2023, 17:02
#129
skkkk


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


Что-то понимания у меня сильно не прибавилось.
Таблица, как я понял, всё же нужна, значения нужно брать из неё.

Цитата:
Сообщение от posetitel Посмотреть сообщение
если перед ячейкой вставить строку или столбец, то все ссылки на эту ячейку собьются, т.к. по адресу ссылки будет уже новая вставленная строка или столбец.
Верно, собьются, цели сделать новую версию экселя не было.)


Цитата:
Сообщение от posetitel Посмотреть сообщение
раз у нас в чертеже появляется переменная со значением из таблицы, то почему бы и дальше эту переменную не использовать. Как варианты использования как вы ранее писали, можно сделать повторный вызов списка переменных и выбирать, какую конкретно вставить в поле
А смысл? Ну будет он такого вида, как во вложении. Какой с него прок? Не проще командой TCF заново поле создать? Если тыкать на ту же ячейку, то второго свойства такого же в чертеже не появится. Можно просто скопировать/вставить поле прям из одного текстового объекта в другой.
Или я что-то недопонял?
Миниатюры
Нажмите на изображение для увеличения
Название: 2023-06-30 at 17-00-44.jpg
Просмотров: 21
Размер:	6.0 Кб
ID:	256989  

Последний раз редактировалось skkkk, 30.06.2023 в 17:08.
skkkk вне форума  
 
Непрочитано 30.06.2023, 17:56
#130
posetitel


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


Да все верно поняли, предыдущие предложения по вариантам модификации лиспа отпали в процессе обсуждения.
В идеале бы конечно, как выразились: "придумать новый эксель",точнее сделать ссылку на конкретную ячейку, чтобы вставка строк в таблице перед этой ячейкой не сбивала привязку к значению... Но сам понимаю, что принципы таблиц автокада несколько иные.
posetitel вне форума  
 
Непрочитано 30.06.2023, 18:06
#131
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Цитата:
Сообщение от posetitel Посмотреть сообщение
если перед ячейкой вставить строку или столбец, то все ссылки на эту ячейку собьются
Продвинутые пользователи скажут "используйте БД", но это не всегда получается.
Можно конвертировать акадовскую таблицу в массив блоков с атрибутами, каждый из блоков будет соответствовать одной строке, каждый атрибут - одной ячейке (будем считать, что структура столбцов неизменна).
На эти атрибуты уже без проблем могут ссылаться поля.
Вся штука в том, чтобы обеспечить соответствие "строкоблоков" первый раз заданным строкам. Чтобы если в екселе и связанной акадовской таблице первая строка стала второй, соответствующий "строкоблок" переместился на вторую позицию, а на первой позиции появился новый. Если первый раз заданная строка таблицы будет все время соответствовать одному и тому же "строкоблоку" с одним и тем же хендлом, ссылающиеся на него поля не будут сбиваться! Чтобы этого добиться, при создании массива строкоблоков хендл каждого из них записывается в последнюю, "служебную" ячейку соотв. строки.
Профит, что ли...
Написал себе для этих целей довольно глючный лисп, пока не хочу выкладывать на посмешище...

Последний раз редактировалось kp+, 30.06.2023 в 18:20.
kp+ вне форума  
 
Непрочитано 30.06.2023, 19:13
#132
posetitel


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


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

Последний раз редактировалось posetitel, 30.06.2023 в 19:21.
posetitel вне форума  
 
Непрочитано 30.06.2023, 19:40
#133
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Offtop:
Цитата:
Сообщение от posetitel Посмотреть сообщение
Переделывание таблицы в блок - это уже какие-то костыли...
....Как вариант - копировать в свойство чертежа не адрес ячейки, а содержимое ячейки
Использование свойств чертежа в качестве БД, тоже ... не самое изящное решение. Ну не предназначены они для такого.
И вообще, большая часть всех прог на этом форуме - "костыли" для тех, у кого нет денег на "шашечки", а "ехать" хоть как-то надо
Не костыли, то уже полноценная вертикалка типа Acad MEP или близкое к этому, типа VetCAD, ruCAD, линейки CS...
kp+ вне форума  
 
Автор темы   Непрочитано 01.07.2023, 12:12
#134
skkkk


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Использование свойств чертежа в качестве БД, тоже ... не самое изящное решение.
Вот полностью согласен. Я тогда только начинал вникать в лисп и встала такая задача. Весь этот код собран из кусков (готовых функций) с моей минимальной доработкой и обёрткой. Тогда хватило мозгов только на такое решение.
После я полностью пересмотрел модель своей работы, уйдя от полей в пользу генерации результатов лиспом, а отчасти - перейдя всё же в эксель, а еще позднее задача вообще отпала.

А так можно было бы и развить эту прогу, можно и бд подкрутить, и даже реактор на таблицу привесить, чтоб при изменении количества строк или столбцов менялась адресация ячеек, но это уже будет настолько грандиозный проект, что съест немеряную кучу времени, а смысла большого от него нет. Автокадовские таблицы для подобных задач - тугая вещь, тупиковый путь это. Разве что для каких-то мелких задачек.
skkkk вне форума  
 
Непрочитано 04.07.2023, 18:57
#135
posetitel


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


Товарищи, ссылался на другие лиспы, а стал их искать и что-то не нахожу
Поделитесь ссылкой на лисп, который копирует значение из ячейки таблицы и вставляет в другое место (выноска, другая таблица, мультитекст и т.д.), только минует добавление свойств в файл чертежа. Ну т.е. такой же лисп, как и в теме, но без промежуточных переменных в чертеже.
posetitel вне форума  
 
Автор темы   Непрочитано 06.07.2023, 14:31
1 | #136
skkkk


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


posetitel, вот, подправил.
Не совсем по теме, поэтому запрячу под кат.
Код:
[Выделить все]
;;--------------------------------------------------------
;; Команда копирует содержимое ячейки таблицы в выбранный пользователем текстовый объект.
;; Если на запрос объекта выбрать пустое место, то вставится Мтекст с содержимым выбранной ячейки (в текущем стиле).
;; Подробности на https://forum.dwg.ru/showthread.php?p=2040248#post2040248
;; Описание используемых функций
;; get_cell_by_pick
;; get_cell_value
;; _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
(defun C:CTC nil (C:CopyTableCell))
(defun C:CopyTableCell ( / *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)))
				(setq TextHeight (vla-GetCellTextHeight tblobj row col))
				(setq ColumnWidth (vla-GetColumnWidth tblobj col))
				(setq str (LM:UnFormat (vla-GetText tblobj row col) nil))

				(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


;;--------------------------------------------------------
;; Команда обновляет свойства чертежа (dvgprops) и поля, созданные 
;; командой TextCellField (см. выше) в соответствии с содержимым ячейки таблицы


;;--------------------------------------------------------
;; Функция получает ячейку таблицы по указанной точке
;; Если точка внутри таблицы, возвращает список вида (<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




(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)

(princ "C:CTC")
(princ)
skkkk вне форума  
 
Непрочитано 23.11.2023, 09:13
#137
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 807


Добрый день.
А обратный вариант возможен?
К примеру мне нужно сделать поле цифрового значения мультивыноски в ячейке таблицы.
Стандартным путем слишком муторно (Вставить поле, выбрать строку "Объект", указать объект, выбрать строку "значение").
А было бы удобно, если как в этом лиспе, только наоборот. Лисп - выбрать мультивыноску- указать ячейку таблицы.
Возможно такое?
__________________
AutoCad 2011 -> AutoCad 2013
Astartes вне форума  
 
Непрочитано 23.11.2023, 15:09
#138
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


возможно. без изысков.
Код:
[Выделить все]
 
(defun c:ml_cell (/ mleader_contents_field)
	(setvar 'cmdecho 0)
	(setq mleader_contents_field 
		(strcat "%<\\AcObjProp Object(%<\\_ObjId " 
			  	(itoa (vla-get-objectid (vlax-ename->vla-object 
											(car (entsel "\nВыберите мультивыноску: "))
										)
					  )
				) 
				">%).TextString>%"
		)
	)
	(command-s "_tabledit" (getpoint "\nВыберите ячейку таблицы: ") mleader_contents_field) 
	(setvar 'cmdecho 1)
)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 24.11.2023, 05:47
#139
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 807


Цитата:
Сообщение от koMon Посмотреть сообщение
возможно. без изысков.
Супер. То что нужно. Спасибо.
__________________
AutoCad 2011 -> AutoCad 2013
Astartes вне форума  
 
Непрочитано 24.11.2023, 14:04
#140
Ingpro


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


koMon, а можно к mleader, добавить текст и мтекст?
Т.е. указать текст (или мтекст) и вставить значение полем в таблицу.
Ingpro вне форума  
 
Непрочитано 24.11.2023, 15:26
#141
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


можно
Код:
[Выделить все]
 
(defun c:mltxt_cell (/ contents_field ename)
	(setvar 'cmdecho 0)
	(setq contents_field 
		(strcat "%<\\AcObjProp Object(%<\\_ObjId " 
			  	(itoa (vla-get-objectid (vlax-ename->vla-object 
											(while (or (null ename)
												   	   (and
													   		(/= (cdr (assoc 0 (entget ename))) "TEXT")
													   		(/= (cdr (assoc 0 (entget ename))) "MTEXT")
												   	   		(/= (cdr (assoc 0 (entget ename))) "MULTILEADER")
													   )
											       )
											  	   (setq ename (car (entsel "\nВыберите {м}текст, мультивыноску: ")))
											)
										)
					  )
				) 
				">%).TextString>%"
		)
	)
	(command-s "_tabledit" (getpoint "\nВыберите ячейку таблицы: ") contents_field) 
	(setvar 'cmdecho 1)
)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 24.11.2023, 15:49
#142
Ingpro


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


Здорово! koMon, thank you very much!
Миниатюры
Нажмите на изображение для увеличения
Название: Image 2.png
Просмотров: 22
Размер:	6.5 Кб
ID:	260204  
Ingpro вне форума  
Ответ
Вернуться   Форум 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