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

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

Как выбрать определенную ячейку таблицы?

Ответ
Поиск в этой теме
Непрочитано 12.04.2017, 13:08 #1
Как выбрать определенную ячейку таблицы?
AlexZh
 
Регистрация: 23.09.2015
Сообщений: 146

Здравствуйте!

Подскажите, как добраться до ячейки таблицы по методу entsel?
Просмотров: 3059
 
Непрочитано 12.04.2017, 13:28
#2
kp+

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


Цитата:
Сообщение от AlexZh Посмотреть сообщение
по методу entsel
Именно с помощью entsel - никак. Если надо узнать, в какую ячейку ткнули мышью - нужен метод vla-Hittest, хелп в помощь.
kp+ вне форума  
 
Непрочитано 12.04.2017, 17:32
#3
frostmourn


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


Ну, справедливости ради - entsel возвращает точку, геометрию ячеек из таблицы получить можно, так что, если очень хочется... Но практического смысла, да, никакого.
frostmourn вне форума  
 
Непрочитано 13.04.2017, 12:53
#4
valerik88


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


Кусок из одной моей программки
Код:
[Выделить все]
   (setq ent (entsel))
  (setq vla_table (vlax-ename->vla-object (car ent)))
  (vla-HitTest vla_table (vlax-3d-point (cadr ent))
    (vlax-3d-point (trans (getvar 'ViewDir) 1 0))
    'row0
    'col0
 )
valerik88 вне форума  
 
Автор темы   Непрочитано 13.04.2017, 16:52
#5
AlexZh


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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Кусок из одной моей программки
Код:
[Выделить все]
   (setq ent (entsel))
  (setq vla_table (vlax-ename->vla-object (car ent)))
  (vla-HitTest vla_table (vlax-3d-point (cadr ent))
    (vlax-3d-point (trans (getvar 'ViewDir) 1 0))
    'row0
    'col0
 )

Спасибо! Но не понял, где и как программно выбирается выбранная ячейка.
AlexZh вне форума  
 
Непрочитано 13.04.2017, 20:55
#6
skkkk


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


Цитата:
Сообщение от frostmourn Посмотреть сообщение
Ну, справедливости ради - entsel возвращает точку, геометрию ячеек из таблицы получить можно, так что, если очень хочется... Но практического смысла, да, никакого.
Практический смысл можно попробовать "притянуть". Пример. Результаты некоторых программных вычислений (допустим, суммы длин линий или площади участков) нужно вставить либо в таблицу, либо в существующий текст/мтекст/атрибут/выноску, в зависимости от каких-либо условий. Поскольку указание всех "текстоподобных" объектов целесообразно выполнять посредством entsel (nentsel), то для универсальности можно использовать entsel в связке с HitTest для таблиц, дабы для каждого случая не вызывать отдельную команду или не "бегать" по опциям.
Другой вопрос, что универсальность не всегда суть удобство и практичность по отношению к конкретной отдельно взятой задаче. Необходимо следить, чтобы в случае с таблицей при указании ячейки центр "квадратика" непременно попал в нужную ячейку. Удобнее, конечно, указать "крестиком" (интерактивный выбор точки - getpoint).
Цитата:
Сообщение от AlexZh Посмотреть сообщение
Спасибо! Но не понял, где и как программно выбирается выбранная ячейка.
Непосредственно в этих строках:
Код:
[Выделить все]
(vla-HitTest vla_table (vlax-3d-point (cadr ent))
   (vlax-3d-point (trans (getvar 'ViewDir) 1 0))
   'row0
   'col0
)
Только в функцию vla-HitTest аргументы передаются не по значению, как обычно, а в виде ссылки, то есть, после выполнения выражения в переменных row0 и col0 будут "сидеть" соответственно значения строки и столбца указанной ячейки таблицы. А точка для передачи во vla-HitTest получается из выражения (cadr ent) - см., что возвращает функция entsel.
Для более точного ответа надо бы более точный вопрос, а не просто "как добраться до ячейки"... Что нужно получить в итоге?

Последний раз редактировалось skkkk, 13.04.2017 в 21:01.
skkkk вне форума  
 
Автор темы   Непрочитано 14.04.2017, 09:56
#7
AlexZh


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


Спасибо, ребята!

Наковырял вот такого!

Код:
[Выделить все]
 (defun c:1z_changcell (/       _ss->lst	       _hit-test       acapp
		       acdoc   accm    cmax    cmin    col     l1
		       l2      obj     p1      p2      pt      rmax
		       rmin    ss      znach   znach1  znach2
		      )
;;; Ищет и заменяет в выбранных ячейках таблицы искомое значение на
;;; предлагаемое
  (load "_dwgru-conv-value-vla-to-list")
  (defun _ss->lst (ss / i lst)
    (repeat (setq i (sslength ss))
      (setq
	lst (cons (vlax-ename->vla-object (ssname ss (setq i (1- i))))
		  lst
	    ) ;_ конец cons
      ) ;_ конец setq
    ) ;_ конец repeat
  ) ;_ конец defun
  (defun _hit-test (pt lst)
    (vl-some (function
	       (lambda (obj / row col)
		 (if (eq :vlax-true
			 (vla-hittest
			   obj
			   (vlax-3d-point (trans pt 1 0))
			   (vlax-3d-point (trans (getvar 'viewdir) 1 0))
			   'row
			   'col
			 ) ;_ конец vla-hittest
		     ) ;_ конец eq
		   (list obj row col)
		 ) ;_ конец if
	       ) ;_ конец lambda
	     ) ;_ конец function
	     lst
    ) ;_ конец vl-some
  ) ;_ конец defun
  (setq	acapp (vlax-get-acad-object)
	acdoc (vla-get-activedocument acapp)
  ) ;_ конец setq
  (if (setq
	ss (ssget "_X"
		  (list (cons 0 "ACAD_TABLE") (cons 410 (getvar 'ctab)))
	   ) ;_ конец ssget
      ) ;_ конец setq
    (progn
      (setq ss (_ss->lst ss))
      (while (and (setq p1 (getpoint "\nSpecify First Corner: "))
		  (not (setq l1 (_hit-test p1 ss)))
	     ) ;_ конец and
	(princ "\nPoint does not lie in Table Cell.")
      ) ;_ конец while
      (if p1
	(progn
	  (while
	    (and (setq p2 (getcorner p1 "\nSpecify Opposite Corner: "))
		 (not (setq l2 (_hit-test p2 (list (car l1)))))
	    ) ;_ конец and
	     (princ "\nPoint not valid.")
	  ) ;_ конец while
	  (if p2
	    (progn
	      (vla-startundomark acdoc)
	      (setq obj	 (car l1)
		    rmin (1- (min (cadr l1) (cadr l2)))
		    rmax (max (cadr l1) (cadr l2))
		    cmin (1- (min (caddr l1) (caddr l2)))
		    cmax (max (caddr l1) (caddr l2))
		    row	 rmin
		    col	 cmin
	      ) ;_ конец setq
	      (if (not (setq znach1
			      (getstring t "/n Найти: ")
		       ) ;_ конец setq
		  ) ;_ конец not
		exit
	      )		      ; _
			      ; конец
			      ; getstring
	      (if (not (setq
			 znach2	(getstring t "/n Заменить на: ")
		       ) ;_ конец setq
		  ) ;_ конец not
	      )		      ; _
			      ; конец
			      ; getstring
	      (if (= (type znach1) 'int)
		(setq znach1 (float znach1))
		(if (= (type znach1) 'real)
		  (setq znach1 (rtos znach1))
		) ;_ конец if
	      ) ;_ конец if
	      (if (= (type znach2) 'int)
		(setq znach2 (float znach2))
		(if (= (type znach2) 'real)
		  (setq znach2 (rtos znach2))
		) ;_ конец if
	      ) ;_ конец if
	      (vla-put-regeneratetablesuppressed obj :vlax-true)
	      (while (<= (setq row (1+ row)) rmax)
		(setq col cmin)
		(while (<= (setq col (1+ col)) cmax)
		  (if (setq znach (_dwgru-conv-value-vla-to-list
				    (vla-getcellvalue obj row col) ; _
			      ; конец
			      ; vla-getcellvalue
				  ) ; _ конец
			      ; _dwgru-conv-value-vla-to-list
		      ) ;_ конец setq
		    (progn (if (= (type znach) 'int)
			     (setq znach (float znach))
			     (if (= (type znach) 'real)
			       (setq znach (rtos znach))
			     ) ;_ конец if
			   ) ;_ конец if
			   (if (vl-string-search
				 znach1
				 znach ;_ конец setq
			       ) ; _ конец
			      ; vl-string-search
			     (vla-setcellvalue
			       obj
			       row
			       col
			       (vl-string-subst znach2 znach1 znach)
			      ; _
			      ; конец
			      ; vl-string-subst
			     ) ;_ конец vla-SetCellValue
			   ) ;_ конец if
		    ) ;_ конец if
		  ) ;_ конец while
		) ;_ конец while
	      ) ;_ конец while
	      (vla-put-regeneratetablesuppressed obj :vlax-false)
	      (vla-endundomark acdoc)
	    ) ;_ конец progn
	  ) ;_ конец if
	) ;_ конец progn
      ) ;_ конец if
      (princ "\nNo Tables found in drawing.")
    ) ;_ конец progn
  ) ;_ конец if
  (princ)
) ;_ конец defun


(vl-load-com) (princ)
;|«Visual LISP© Format Options»
(72 2 30 2 T "конец " 72 9 1 1 0 T nil T T)
;*** НЕ добавляйте текст под комментариями! ***|;
Коряво, но работает!)

Последний раз редактировалось AlexZh, 14.04.2017 в 11:34.
AlexZh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как выбрать определенную ячейку таблицы?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка рисунка (изображения) в ячейку таблицы AUTOCAD 2006 Геннадий+ AutoCAD 7 25.04.2022 15:12
Помогите выбрать климатический район из таблицы 50* СНиП II-23-81* для Красноярска. Krieger Прочее. Архитектура и строительство 25 23.06.2016 08:37
Некорректная вставка поля в ячейку таблицы Shturman121 AutoCAD 4 11.02.2015 15:07
как с помощью vba внести значение в определенную ячейку определенной таблицы autocada Faeton Программирование 6 08.12.2012 11:32
ERROR в ссылках на ячейку другой таблицы... fenix AutoCAD 2 29.11.2006 20:32