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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Считывание значение ячейки таблицы в виде Field в AutoLISP

Считывание значение ячейки таблицы в виде Field в AutoLISP

Ответ
Поиск в этой теме
Непрочитано 19.03.2009, 14:38 #1
Считывание значение ячейки таблицы в виде Field в AutoLISP
tokhot
 
Проектирование
 
г. Москва
Регистрация: 17.11.2004
Сообщений: 328

Требуется считать значение ячейки таблицы в виде Field с созданием Мтекст (текст) в AutoLISP.

Лисп считывает значение ячейки А1 из указаной таблицы (взял в соседней теме)

(defun C:PFLD ( / en)
(if (setq en (car (entsel))) (progn
(princ (strcat "\n"
"%<\\AcExpr (Table(%<\\_ObjId "
(vl-princ-to-string (vla-get-objectid (vlax-ename->vla-object en)))
">%).A1)>%"
))
)) ;_endof if progn
(princ)
) ;_endof defun

В результате получается код поля-Field

%<\AcExpr (Table(%<\_ObjId 2130703704>%).A1)>%

ВОПРОС как организовать цикл изменения адреса ячейки (A1)

В принципе значение количества строк и столбцов можно вытащить
сгенерировав поле-field вида

%<\AcObjProp Object(%<\_ObjId 2128102912>%).Rows>% для кол. строк и
%<\AcObjProp Object(%<\_ObjId 2128102912>%).Columns>% для кол. столбцов

Можно ли сделать проще: указав ячейку таблицы получить МТекст с полем (field) со значением ячейки?
Просмотров: 9829
 
Непрочитано 19.03.2009, 15:05
#2
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Это?
http://www.caduser.ru/forum/index.ph...D=23&TID=46080
Makswell вне форума  
 
Непрочитано 19.03.2009, 15:44
#3
VVA

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


Узнать номер столбца и строки можно. Сослаться полем не знаю
Код:
[Выделить все]
(defun C:TEST ()
  (vl-load-com)
  (if (and
	(setq pt (getpoint "\n Укажите точку внутри ячейки таблицы:"))
	(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
    (alert (strcat "Vla object таблицы: "
		   (vl-princ-to-string tblobj)
		   "\nСтрока: "
		   (itoa row)
		   " столбец: "
		   (itoa col)
		   "\nТекст в ячейке: " (vla-GetText tblobj row col)
	   ) ;_ end of strcat
    ) ;_ end of alert
    (alert "Мимо")
  ) ;_ end of if
  (princ)
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 19.03.2009, 16:29
#4
tokhot

Проектирование
 
Регистрация: 17.11.2004
г. Москва
Сообщений: 328


У меня есть большая таблица. Мне из неё нужны числовые значения ячейки в виде Мтекст.
Сейчас делаю так: создаю Мтекст -> вставляю в него поле-field -> выбираю функцию "формула" и определяю значение ячейки (cell) указанием. И так делаю для каждой ячейки.

Требуется автоматизировать этот трудоемкий процесс.

А вот как сделать не знаю?
Помогите идеями!
tokhot вне форума  
 
Непрочитано 19.03.2009, 17:42
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


А зачем так сложно если можно без всяких полей получить содержимое конкретной ячейки таблицы?
Александр Ривилис вне форума  
 
Непрочитано 19.03.2009, 19:20
#6
VVA

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


tokhot, Пробуй это. Указываешь ячейку таблицы, на курсоре висит текст со значением (значение должно быть числом)
Код:
[Выделить все]
(defun C:TC2T (/ ColLetter)
;;;Table Cell value To Text
  (defun ColLetter (N				  ;Integer
		    /
		    Res				  ;resulting string
		    TMP				  ;work variable
		   )
    (setq Res "")
    (while (> N 0)
      (setq TMP	(rem N 26)			  ;remainder of N divided by 26
	    TMP	(if (zerop TMP)			  ;reset to "Z"
		  (setq	N   (1- N)		  ;move under next order
			TMP 26			  ;set to Z offset value
		  ) ;_ end of setq
		  TMP
		)				  ;use value as it is
	    Res	(strcat				  ;Add character
		  (chr (+ 64 TMP))		  ;Offset plus 64 ("A" = 65)
		  Res
		)				  ;existing string
	    N	(/ N 26)			  ;shift down an order
      ) ;_ end of setq
    ) ;_ end of while
    Res
  ) ;_ end of defun
  (vl-load-com)
  (or *TEXTSIZE* (setq *TEXTSIZE* (getvar "TEXTSIZE"))) ;_ Высота тексtа
  (if (and
	(progn (princ "\nВысота текста = ") (princ *TEXTSIZE*) t)
	(setq
	  pt (getpoint " Укажите точку внутри ячейки таблицы <выход>:")
	) ;_ end of setq
	(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
    (progn
      (setq value (vla-GetText tblobj row col))
      (setq row	(1+ row)
	    col	(1+ col)
      ) ;_ end of setq
      (setq fld	(strcat
		  "%<\\AcExpr (Table(%<\\_ObjId "
		  (vl-princ-to-string (vla-get-objectid tblobj))
		  ">%)."
		  (ColLetter col)
		  (itoa row)
		  ")>%"
		) ;_ end of strcat
      ) ;_ end of setq
      (if (/= (vl-string-trim " \t\n" value) "")
	(progn
	  (setq	txt (entmakex
		      (list
			(cons 0 "TEXT")
			(cons 100 "AcDbEntity")
			(cons 100 "AcDbText")
			(cons 72 0) ;_ выравнивание влево
			(cons 1 fld)
						  ;(cons 7 style) ;_Текущий стиль
						  ;(cons 8 layer) ;_Текущий слой
			(cons 10 pt)
			(cons 11 pt)
			(cons 40 *TEXTSIZE*) ;_Высота текста
		      ) ;_ list
		    ) ;_ entmakex
	  ) ;_ end of setq
	  (setvar "cmdecho" 0)
	  (vl-cmdf "_updatefield" txt "")
;;;	  (vl-cmdf "_.Move" txt "" pt pause)
	  (vl-cmdf "_.copybase"		 pt	    txt
		   ""	      "_.erase"	 txt	    ""
		   "_.pasteclip"	 "_none"    pause
		  ) ;_ end of vl-cmdf
	  (setq txt (entlast))
	  (entmakex
	    (list
	      (cons 0 "TEXT")
	      (cons 100 "AcDbEntity")
	      (cons 100 "AcDbText")
	      (cons 72 0) ;_ выравнивание влево
	      (cons 1 fld)
						  ;(cons 7 style) ;_Текущий стиль
						  ;(cons 8 layer) ;_Текущий слой
	      (assoc 10 (entget txt))
	      (assoc 11 (entget txt))
	      (cons 40 *TEXTSIZE*) ;_Высота текста
	    ) ;_ list
	  ) ;_ entmakex
	  (entdel txt)
	  (setq txt (entlast))
	  (vl-cmdf "_updatefield" txt "")
	) ;_ end of progn
	(alert "В ячейке пусто")
      ) ;_ end of if
    ) ;_ end of progn
    (princ " ..Мимо.. ")
  ) ;_ end of if
  (princ)
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 20.03.2009, 10:50
#7
tokhot

Проектирование
 
Регистрация: 17.11.2004
г. Москва
Сообщений: 328


Цитата:
Сообщение от VVA Посмотреть сообщение
tokhot, Пробуй это. Указываешь ячейку таблицы, на курсоре висит текст со значением (значение должно быть числом)
То что надо!!!
Спасибо большое!!!

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

Цитата:
А зачем так сложно если можно без всяких полей получить содержимое конкретной ячейки таблицы?
Это как ? Взорвав таблицу что ли?

Последний раз редактировалось tokhot, 20.03.2009 в 11:14.
tokhot вне форума  
 
Непрочитано 20.03.2009, 16:59
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от tokhot Посмотреть сообщение
Это как ? Взорвав таблицу что ли?
Вообще-то это тоже вариант (только не оригинальную таблицу, а копию). Но я вообще-то имел виду не это.
Примитив таблица (Table) имеет свойства Rows и Columns (т.е. можно получить размер таблицы), и для каждой ячейки в цикле получить ее содержимое (методом GetText(row,col))
Александр Ривилис вне форума  
 
Непрочитано 08.01.2017, 16:44
#9
kurstep


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


А подскажите как можно программно узнать адрес ячейки (но не в формате (i j) - номер строки, номер столбца , а в виде А1 или D6)
kurstep вне форума  
 
Непрочитано 08.01.2017, 17:54
1 | #10
skkkk


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


kurstep, полагаю, подойдет функция Number2Alpha отсюда.
Код:
[Выделить все]
(strcat (vl-princ-to-string (Number2Alpha (1+ col)))(vl-princ-to-string (1+ row)))
вернет адрес ячейки в нужном формате. Здесь col - номер столбца, row - номер строки.
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Считывание значение ячейки таблицы в виде Field в AutoLISP

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Mathcad Вывод значений интеграла в виде таблицы Liasik Прочее. Программное обеспечение 5 13.02.2009 11:59
как с помощью vba начертить линию vasyavip Программирование 77 09.10.2008 23:17
Вставка содержимого ячейки таблицы в поле в mtext Witalij AutoCAD 11 22.11.2007 14:15
структурированный список Holon Программирование 22 11.09.2007 14:09