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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Достать "формулу" из ячейки таблицы autocad

Достать "формулу" из ячейки таблицы autocad

Ответ
Поиск в этой теме
Непрочитано 11.12.2018, 21:08
Достать "формулу" из ячейки таблицы autocad
tsetse
 
Инженер-конструктор
 
Москва
Регистрация: 25.12.2015
Сообщений: 77

Добрый день! Возникла следующая проблема. Имеется таблица, в одной из ее ячеек, например A5, вписана формула =A3+A4. Возникла необходимость "достать данную формулу. Стандартный метод vla-getText возвращает число, а не формулу "=A3+A4". Можно ли как-то это побороть?
12.12.2018
Вот что получилось в результате
Код:
[Выделить все]
 (defun C:PCS ( / cellset)
; Функция "складывает" ячейки таблицы и записывает в выбранную
(vl-load-com)
(setq pt nil)
(setq cellset "=")
(setq findedcell nil)
(setq row nil)
(setq col nil)
(setq tblobj nil)
; Запрашиваем ячейки, которые нужно добавить в цикле
(while
	; Запрашиваем точку внутри ячейки
	(setq pt (getpoint "\n Укажите ячейки таблицы, которые нужно сложить:"))
	; получаем row и col в буквенном формате а также указатель на таблицу tblobj
	(GET_CELL_ID pt)
	; добавляем элемент в строку, которую потом впишем	
	(setq cellset (strcat cellset findedcell "+" ))
	(setq findedcell nil)
	(setq row nil)
	(setq col nil)
) ; end of while
; Удаляем последний знак плюс из cellset
(progn
	(setq cellsetlen (strlen cellset))
	(setq cellsetlen (- cellsetlen 1))
	(setq cellset (substr cellset 1 cellsetlen))
	(setq cellsetlen nil)
) ; end of progn
; Запрашиваем ячейку, в которую вписать сумму
(setq pt (getpoint "\n Укажите ячейку таблицы, в которую вписать сумму:"))
; получаем row и col в буквенном формате а также указатель на таблицу tblobj
(GET_CELL_ID pt)
; получаем содержимое заполняемой ячейки
(CELL_FIELD row col tblobj)
; Записываем в ячейку строку-формулу
(vla-SetText tblobj row col cellset)
(setq row nil)
(setq col nil)
(setq tblobj nil)
) ; end of defun

;________________________________________________________________________________


(defun C:PCSA ( / cellset)
; Функция "добавляет" к указанной ячейке таблицы выбранные
(vl-load-com)
(setq pt nil)
(setq cellset "=")
(setq findedcell nil)
(setq row nil)
(setq col nil)
(setq tblobj nil)
(setq row1 nil)
(setq col1 nil)
(setq tblobj1 nil)
(setq field_string nil)
; Запрашиваем точку внутри ячейки к которой добавляем
(setq pt (getpoint "\n Укажите ячейку таблицы, к которой добавляем:"))
; получаем row и col в буквенном формате а также указатель на таблицу tblobj
(GET_CELL_ID pt)
(setq tblobj1 tblobj)
(setq row1 row)
(setq col1 col)
(setq row nil)
(setq col nil)
(setq tblobj nil)
; получаем содержимое заполняемой ячейки
(setq field_string "")
(CELL_FIELD row1 col1 tblobj1)
; Запрашиваем ячейки, на которые домножаем
; Запрашиваем ячейки, которые нужно добавить в цикле
(while
	; Запрашиваем точку внутри ячейки
	(setq pt (getpoint "\n Укажите ячейки таблицы, которые нужно добавить:"))
	; получаем row и col в буквенном формате а также указатель на таблицу tblobj
	(GET_CELL_ID pt)
	; добавляем элемент в строку, которую потом впишем	
	(setq cellset (strcat cellset findedcell "+" ))
	(setq findedcell nil)
	(setq row nil)
	(setq col nil)
) ; end of while
; собираем новый текст
(setq txtnew (strcat cellset "(" field_string ")"))
(vla-SetText tblobj1 row1 col1 txtnew)
(setq row1 nil)
(setq col1 nil)
(setq tblobj1 nil)
(setq row nil)
(setq col nil)
(setq tblobj nil)
) ; end of defun

;________________________________________________________________________________


(defun C:PCM ( / cellset)
; Функция "перемножает" выбранные ячейки таблицы и записывает в выбранную
(vl-load-com)
(setq pt nil)
(setq cellset "=")
(setq findedcell nil)
(setq row nil)
(setq col nil)
(setq tblobj nil)
; Запрашиваем ячейки, которые нужно добавить в цикле
(while
	; Запрашиваем точку внутри ячейки
	(setq pt (getpoint "\n Укажите ячейки таблицы, которые нужно перемножить:"))
	; получаем row и col в буквенном формате а также указатель на таблицу tblobj
	(GET_CELL_ID pt)
	; добавляем элемент в строку, которую потом впишем	
	(setq cellset (strcat cellset findedcell "*" ))
	(setq findedcell nil)
	(setq row nil)
	(setq col nil)
) ; end of while
; Удаляем последний знак * из cellset
(progn
	(setq cellsetlen (strlen cellset))
	(setq cellsetlen (- cellsetlen 1))
	(setq cellset (substr cellset 1 cellsetlen))
	(setq cellsetlen nil)
) ; end of progn
; Запрашиваем ячейку, в которую вписать произведение
(setq pt (getpoint "\n Укажите ячейку таблицы, в которую вписать произведение:"))
; получаем row и col в буквенном формате а также указатель на таблицу tblobj
(GET_CELL_ID pt)
; получаем содержимое заполняемой ячейки
(CELL_FIELD row col tblobj)
; Записываем в ячейку строку-формулу
(vla-SetText tblobj row col cellset)
(setq row nil)
(setq col nil)
(setq tblobj nil)
) ; end of defun

;________________________________________________________________________________

(defun C:PCMA ( / cellset)
; Функция "домножает" указанную ячейку таблицы на выбранные
(vl-load-com)
(setq pt nil)
(setq cellset "=")
(setq findedcell nil)
(setq row nil)
(setq col nil)
(setq row1 nil)
(setq col1 nil)
(setq tblobj nil)
(setq tblobj1 nil)
(setq field_string nil)
; Запрашиваем точку внутри ячейки которую домножаем
(setq pt (getpoint "\n Укажите ячейку таблицы, которую нужно домножить:"))
; получаем row и col в буквенном формате а также указатель на таблицу tblobj
(GET_CELL_ID pt)
(setq tblobj1 tblobj)
(setq row1 row)
(setq col1 col)
(setq row nil)
(setq col nil)
(setq tblobj nil)
; получаем содержимое заполняемой ячейки
(setq field_string "")
(CELL_FIELD row1 col1 tblobj1)
; Запрашиваем ячейки, на которые домножаем
(while
		(setq pt (getpoint "\n Укажите ячейки таблицы, на которые нужно домножить:")) 
		(GET_CELL_ID pt)
		(setq cellset (strcat cellset findedcell "*" ))
		(setq findedcell nil)
) ; end of while
; собираем новый текст
(setq txtnew (strcat cellset "(" field_string ")"))

(vla-SetText tblobj1 row1 col1 txtnew)
(setq row1 nil)
(setq col1 nil)
(setq tblobj1 nil)
(setq row nil)
(setq col nil)
(setq tblobj nil)
) ; end of defun

; Ниже приведены вспомогательные функции
;________________________________________________________________________________

; Функция получения objectID
; Источник: https://discussion.autodesk.com/forums/message.jspa?messageID=6172961
(defun Get-ObjectID-x86-x64 (obj / util)
	(setq util (vla-get-Utility (vla-get-activedocument (vlax-get-acad-object))))
	(if	(= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj)))
		(if	(= (type obj) 'VLA-OBJECT)
     		(if	(> (vl-string-search "x64" (getvar "platform")) 0)
			(vlax-invoke-method util "GetObjectIdString" obj :vlax-False)
			(rtos (vla-get-objectid obj) 2 0)
		)
	)
)

;________________________________________________________________________________

; Функция преобразования кода ячейки таблицы к строковому формату
; Terry Miller (Email: [email protected])
(defun Number2Alpha (Num# / Val#)
	(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
)

;________________________________________________________________________________

; Функция определения кода ячейки
; VVA forum.dwg.ru
(defun GET_CELL_ID (pt)
(if	
	(and
		(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
		tblobj
		row
		col
	) ;_ end of and
	; конвертируем числовой формат кода ячейки в буквенный
	(setq findedcell (strcat (vl-princ-to-string (Number2Alpha (1+ col)))(vl-princ-to-string (1+ row))))
	(alert "Мимо!")
) ; end of if
)

;________________________________________________________________________________

; Функция получения значения ячейки или значения ее поля
; koMon  forum.dwg.ru
(defun CELL_FIELD (#row #col #tbl / fieldlen field_id)
; определяем id поля в выбранной ячейке #row #col таблицы #tbl
(setq field_id (vla-getfieldid #tbl #row #col))
; если field_id=0 (содержимое не поле, то читаем текст, иначе читаем поле
(if (= 0 field_id)
(setq field_string (vla-getText #tbl #row #col))
(progn
(setq field_string 
	(cdr 
		(assoc 2 
			(entget 
				(cdr 
					(assoc 360 
						(entget 
							(vlax-vla-object->ename
								(vla-objectidtoobject
									(vla-get-activedocument (vlax-get-acad-object))
								field_id)
							)
						)
					)
				)
			)
		)
	)
) ; end of seq
(setq fieldlen (strlen field_string))
(setq fieldlen (- fieldlen 8))
; удаляем лишние символы
(setq field_string (substr field_string 9 fieldlen))
) ; end progn
) ; end if
) ; end defun
Вспомогательные функции брал с этого форума.
Lisp работает на стандартный таблицах автокада и добавляет 4 функции
PCS - при запуске просит "пощелкать" по ячейкам, которые мы хотим сложить, затем enter и выбираем, в какую ячейку вписать "формулу". При этом значение ячейки переписывается на "формулу"
PCSA - при запуске просит выбрать ячейку, к которой мы хотим добавить. Затем "щелкаем по ячейкам которые добавляем. При этом значение выбранной вначале ячейки увеличивается на "формулу".
Аналогично
PCM - перемножение ячеек
PCMA - домножение содержимого.
При запуске рекомендую выключать объектные привязки
Вспомогательная функция Get-ObjectID-x86-x64 лежит тут для светлого будущего, когда ячейки лежат в разных таблицах.
Жду критики и советов.
Спасибо всем, кто был активен в данной теме!

Вложения
Тип файла: lsp PUT_CELL_SUM(MULT).lsp (8.2 Кб, 17 просмотров)


Последний раз редактировалось tsetse, 12.12.2018 в 18:28. Причина: Добавил результат
Просмотров: 8040
 
Автор темы   Непрочитано 12.12.2018, 09:43
#21
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Boxa Посмотреть сообщение
tsetse, Вы бы воспользовались утилитой ARXDBG и все для Вас стало бы проще...
Если выбрать таблицу и посмотреть ее dxf , то для ячейки с полем, в коде 344 можно увидеть ссылку на некий объект, если этот объект выбрать, то в dxf коде 2 лежит собственно формула.
Спасибо! Не знал про эту утилиту. А как средствами лисп достать строку? Насколько я понял, arxdbg это внешний инструмент. И если кому то другому будет необходимо использовать лисп, который достает эту строку, ему также нужно будет подключать arxdbg?

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
trir, частенько обычного wcmatch достаточно.
К сожалению, не понял, как wcmatch может мне помочь ((( https://knowledge.autodesk.com/searc...A53AD-htm.html
tsetse вне форума  
 
Непрочитано 12.12.2018, 09:56
#22
Кулик Алексей aka kpblc
Moderator

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


При работе внутри лиспа полная мощь регулярных выражений обычно не требуется. А для проверки совпадения строки с несложной маской wcmath, как правило, более чем достаточно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.12.2018, 10:00
#23
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от trir Посмотреть сообщение
Спасибо! Думаю этот инструмент пригодится мне далее. Сейчас задача : зная objectid таблицы, зная номер ячейки достать строку, которая содержит вписанную в данную ячейку формулу, например A2+A3
tsetse вне форума  
 
Непрочитано 12.12.2018, 10:15
#24
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Offtop:
Цитата:
Сообщение от tsetse Посмотреть сообщение
зная objectid таблицы, зная номер ячейки достать строку, которая содержит вписанную в данную ячейку формулу, например A2+A3
Так, для справки - в .net вообще ничего придумывать не надо для получения формулы, достаточно открыть справку:
Код:
[Выделить все]
// Открываем транзакцию
string lCellForm; 
using (Transaction lAcadTrans = lAcadDoc.TransactionManager.StartTransaction())
{
     // Получаем объект таблицы по ее Id из БД
     Table lTable = lAcadTrans.GetObject( lTableId, OpenMode.ForRead) as Table;
     // Получаем формулу
     lCellForm = lTable.GetFormula(%Строка%,"%Столбец%", 0)
     // Подтверждаем транзакцию
     lAcadTrans.Commit();
}
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.12.2018, 10:17
#25
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Так, для справки - в .net вообще ничего придумывать не надо для получения формулы, достаточно открыть справку:
Код:
[Выделить все]
// Открываем транзакцию
string lCellForm; 
using (Transaction lAcadTrans = lAcadDoc.TransactionManager.StartTransaction())
{
     // Получаем объект таблицы по ее Id из БД
     Table lTable = lAcadTrans.GetObject( lTableId, OpenMode.ForRead) as Table;
     // Получаем формулу
     lCellForm = lTable.GetFormula(%Строка%,"%Столбец%", 0)
     // Подтверждаем транзакцию
     lAcadTrans.Commit();
}
Спасибо, но ветка про lisp.
tsetse вне форума  
 
Непрочитано 12.12.2018, 10:17
#26
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от tsetse Посмотреть сообщение
А как средствами лисп достать строку?
Вы серьезно? Я же прямо написал как это сделать. Поле - объект внутри автокада, из ячейки в таблице достаете ссылку (ObjectId) объекта "поле" и по этой ссылке получаете сам объект "поле" и из него забираете свою формулу.
Boxa вне форума  
 
Автор темы   Непрочитано 12.12.2018, 10:18
#27
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
При работе внутри лиспа полная мощь регулярных выражений обычно не требуется. А для проверки совпадения строки с несложной маской wcmath, как правило, более чем достаточно.
Да, регулярные выражения мне, пока что, не нужны. Задача, мне кажется, должна решаться проще. Поэтому я и обратился к местным гуру.
tsetse вне форума  
 
Непрочитано 12.12.2018, 10:21
#28
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от tsetse Посмотреть сообщение
Спасибо, но ветка про lisp.
если что-то не получается на лиспе или слишком мудреная реализация - можно отдельные функции реализовать на .Net с атрибутом LispFunction и вызывать из лисп-кода, как любую другую функцию)
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.12.2018, 10:22
#29
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы серьезно? Я же прямо написал как это сделать. Поле - объект внутри автокада, из ячейки в таблице достаете ссылку (ObjectId) объекта "поле" и по этой ссылке получаете сам объект "поле" и из него забираете свою формулу.
Формула вписана в ячейку A5 таблицы. Стандартная формула автокад, как и в эксель =A2+A3. То есть в ячейку вписана не формула field со ссылкой на объект, а простая строка =A2+A3. Вопрос как достать эту строку. Пока все способы, которые предлагали на выходе дают %<\AcExpr (Table(%<\_ObjId 616148048>%).A5)>%

Прошу прощения! в приложенной вами ранее картинке действительно видно искомую строку "%<\AcExpr (A2+B2)>%". Насколько я понял, вы нашли эту строку с использованием утилиты ARXDBG. Как найти ее же с использованием лисп?

Последний раз редактировалось tsetse, 12.12.2018 в 10:27. Причина: Добавил комментарий
tsetse вне форума  
 
Непрочитано 12.12.2018, 10:30
#30
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
То есть в ячейку вписана не формула field со ссылкой на объект, а простая строка =A2+A3
неверно, формула это поле объект acdbfield, который находится в словаре ACAD_FIELDLIST
trir вне форума  
 
Автор темы   Непрочитано 12.12.2018, 10:36
#31
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы серьезно? Я же прямо написал как это сделать. Поле - объект внутри автокада, из ячейки в таблице достаете ссылку (ObjectId) объекта "поле" и по этой ссылке получаете сам объект "поле" и из него забираете свою формулу.
Спасибо за внимание! Но я все же не понял, как достать эту строку.
Миниатюры
Нажмите на изображение для увеличения
Название: c8a3a516daa429d15607a3574852b818.png
Просмотров: 28
Размер:	73.4 Кб
ID:	208972  
tsetse вне форума  
 
Автор темы   Непрочитано 12.12.2018, 11:00
#32
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Получилось добраться до искомой строки в четыре! шага с использованием ARXDBG. Как сделать то же, с использованием lisp?
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 20
Размер:	28.9 Кб
ID:	208974  Нажмите на изображение для увеличения
Название: 2.PNG
Просмотров: 21
Размер:	63.7 Кб
ID:	208975  Нажмите на изображение для увеличения
Название: 3.PNG
Просмотров: 22
Размер:	70.2 Кб
ID:	208976  Нажмите на изображение для увеличения
Название: 4.PNG
Просмотров: 20
Размер:	57.5 Кб
ID:	208977  Нажмите на изображение для увеличения
Название: 5.PNG
Просмотров: 19
Размер:	48.4 Кб
ID:	208978  

tsetse вне форума  
 
Непрочитано 12.12.2018, 11:03
| 1 #33
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от tsetse Посмотреть сообщение
Спасибо за внимание! Но я все же не понял, как достать эту строку.
А Вы и не пытались понять.

Что-то мне говорит, что tsetse, на лиспе вообще не пишет... и пытается получить готовое решение...
Даже я, нуб, нубом в лисп (я лисп не знаю от слова совсем) и то, имея подсказки в каком направлении двигаться и форум под рукой, вполне способен написать что-то типа лисп выражения и получит на выходе:
Цитата:
Command: (cdr (assoc 2 (entget (cdr (assoc 360 (entget (cdr (assoc 344 (entget (car (entsel)))))))))))

Select object: "\\AcExpr (A2+B2)"
Причем, я понимаю все ограничения этого выражения и не стоит судить строго, это только пример.
Boxa вне форума  
 
Автор темы   Непрочитано 12.12.2018, 11:27
#34
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Boxa Посмотреть сообщение
А Вы и не пытались понять.

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

Причем, я понимаю все ограничения этого выражения и не стоит судить строго, это только пример.
Спасибо! Это то, что нужно! Правда это вариант для выбранной заранее ячейки. Далее буду думать, как написать функцию, аргументы которой будут номер строки и столбца. И я не нашел, откуда вы привели цитату
Цитата:
Command: (cdr (assoc 2 (entget (cdr (assoc 360 (entget (cdr (assoc 344 (entget (car (entsel)))))))))))
На лиспе действитель, не пишу, но в том, что привели ранее подсказки в каком направлении двигаться не было, кроме картинок с демонстрацией arxdbg

Последний раз редактировалось tsetse, 12.12.2018 в 11:35. Причина: Добавлен комментарий
tsetse вне форума  
 
Непрочитано 12.12.2018, 11:38
1 | 1 #35
koMon


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


Цитата:
Сообщение от tsetse Посмотреть сообщение
аргументы которой будут номер строки и столбца
5 ряд 1 колонка (4/0)

(setq field_id (vla-getfieldid (vlax-ename->vla-object (car (entsel))) 4 0))
(setq field_string (cdr (assoc 2 (entget (cdr (assoc 360 (entget (vlax-vla-object->ename (vla-objectidtoobject (vla-get-activedocument (vlax-get-acad-object)) field_id)))))))))
koMon вне форума  
 
Автор темы   Непрочитано 12.12.2018, 11:54
#36
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от koMon Посмотреть сообщение
5 ряд 1 колонка (4/0)

(setq field_id (vla-getfieldid (vlax-ename->vla-object (car (entsel))) 4 0))
(setq field_string (cdr (assoc 2 (entget (cdr (assoc 360 (entget (vlax-vla-object->ename (vla-objectidtoobject (vla-get-activedocument (vlax-get-acad-object)) field_id)))))))))
Это то, что нужно! Спасибо большое!
tsetse вне форума  
 
Непрочитано 12.12.2018, 12:00
1 | 1 #37
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от tsetse Посмотреть сообщение
но в том, что привели ранее подсказки в каком направлении двигаться не было
Или Вы ее не увидели, что вернее.
Вам подсказывали, как человеку умеющему писать программы, т.е. рассчитывая на некоторый уровень понимания. Увы, это было ошибкой.
Впрочем, Вы получили готовое решение, цель достигнута, обучаться нет смысла. Печально.
Boxa вне форума  
 
Автор темы   Непрочитано 12.12.2018, 18:32
| 1 #38
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Цитата:
Сообщение от Boxa Посмотреть сообщение
Или Вы ее не увидели, что вернее.
Вам подсказывали, как человеку умеющему писать программы, т.е. рассчитывая на некоторый уровень понимания. Увы, это было ошибкой.
Впрочем, Вы получили готовое решение, цель достигнута, обучаться нет смысла. Печально.
Благодарю за критику! К сожалению, делать свои решения либо не умею, либо делаю криво, ибо если пишу на lisp, то что-то крайне простое при крайней необходимости. Стараюсь обучаться, начинаю с малого и в основном с готовых примеров. Благодаря вашим советам узнал новые методы и начал понимать структуру dxf. Спасибо! Результаты добавил в шапку
tsetse вне форума  
 
Автор темы   Непрочитано 16.12.2018, 03:09
#39
tsetse

Инженер-конструктор
 
Регистрация: 25.12.2015
Москва
Сообщений: 77


Продолжая тему. Насколько я понял, функция assoc извлекает только первое вхождение по коду. Т.е. если entget выдал нам такую строку
Код:
[Выделить все]
 ((-1 . <Entity name: 436de330>) (0 . "FIELD") (330 . <Entity name: 436de320>) (5 . "C7B") (100 . "AcDbField")
 (1 . "AcExpr") (2 . "\\AcExpr (1+%<\\_FldIdx 0>%+%<\\_FldIdx 1>%) \\f \"%lu2%pr2%ds44\"") (90 . 2) 
(360 . <Entity name: 57484570>) (360 . <Entity name: 574841b0>) 
(97 . 0) (91 . 0) (92 . 0) (94 . 59) (95 . 2) (96 . 0) (300 . ""))
то (assoc 360) вернет только первый элемент (360 . <Entity name: 57484570>).
Как достать второй элемент? Пока я вижу только такой метод, вычеркнуть первый найденный, повторить поиск. Можно ли как то проще?
tsetse вне форума  
 
Непрочитано 16.12.2018, 10:27
1 | 1 #40
Кулик Алексей aka kpblc
Moderator

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


Можно. Используй vl-remove / vl-remove-if / vl-remove-if-not и анализируй результат.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Достать "формулу" из ячейки таблицы autocad

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы. skkkk Готовые программы 141 24.11.2023 15:49
Перенести данные с таблицы AutoCad в Eccess Jeneva AutoCAD 2 23.06.2017 10:11
В ячейке одной таблицы есть текст, как сделать чтоб этот текст отображался в ячейки другой таблицы? Basily AutoCAD 2 05.02.2017 16:46
Как программно узнать координаты ячейки таблицы (для LISP)? kp+ LISP 0 15.02.2016 11:41
Блокирование высоты ячейки таблицы Autocad casaatik AutoCAD 3 15.09.2011 15:40