dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

Возможно ли выцепить текст у таблиц? Как это можно реализовать на AutoLISP?

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 28.08.2009, 08:35 #1
Возможно ли выцепить текст у таблиц? Как это можно реализовать на AutoLISP?
lexluther
 
Регистрация: 19.03.2009
Сообщений: 51

lexluther вне форума Вставить имя

Добрый день,

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

Имеется в виду таблица на автокадовском рисунке.

С уважением.
Просмотров: 5228
 
Непрочитано 28.08.2009, 09:00
#2
Кулик Алексей aka kpblc
Moderator

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


Из таблицы текст получить невозможно. Из ячейки (по ее адресу) - запросто. По-моему, надо смотреть GetValue.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 28.08.2009, 09:27
#3
lexluther


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


Т.е. можно перебрать все ячейки таблицы и получить у них текст у каждой? Это то что мне нужно как раз. Сори за глупый вопрос, я новичек в Лиспе, а как это можно сделать хоть приблизительный код
lexluther вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.08.2009, 12:04
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Код:
[Выделить все]
(defun gettabledata (tbl / lst lst1 rows col); возращает список списков по строкам таблицы
(if (and tbl (= (type tbl) 'ename) (= (cdr (assoc 0 (entget tbl))) "ACAD_TABLE"))
(progn
(setq row 0 col 0 tbl (vlax-ename->vla-object tbl))
(repeat (vla-get-rows tbl)
(repeat (vla-get-columns tbl)
(setq lst (append lst (list (vla-gettext tbl row col))))
(setq col (1+ col))
);end of repeat
(if lst1
(setq lst1 (append lst1 (list lst)))
(setq lst1 (list lst))
);end of if
(setq row (1+ row) col 0 lst nil)
);end of repeat
));end of progn & if
lst1
);end gettabledata
пример запуска - (gettabledata (entlast)), (gettabledata (car (entsel)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.08.2009, 12:09
#5
Makswell

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


Вот так например можно получить содержимое ячейки, расположенной на пересечении 2-й строки и 3-го столбца. Ну и далее по аналогии тебе будет наверно не сложно разобраться.
Код:
[Выделить все]
(defun test (/ obj)
  (vl-load-com)
  (if (setq obj (car (entsel)))
    (progn
      (setq obj (vlax-ename->vla-object obj))
      (if (= (vla-get-ObjectName obj) "AcDbTable")
	(progn
	  (vla-GetText obj 1 2)
	)
      )
    )
  )
)
Добавлено:
Что-то я видимо припозднился немного с советом-то. Ну да ладно, пусть будет.
Makswell вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 30.08.2009, 10:11
#6
lexluther


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


Цитата:
Сообщение от Makswell Посмотреть сообщение
Вот так например можно получить содержимое ячейки, расположенной на пересечении 2-й строки и 3-го столбца. Ну и далее по аналогии тебе будет наверно не сложно разобраться.
Код:
[Выделить все]
(defun test (/ obj)
  (vl-load-com)
  (if (setq obj (car (entsel)))
    (progn
      (setq obj (vlax-ename->vla-object obj))
      (if (= (vla-get-ObjectName obj) "AcDbTable")
    (progn
      (vla-GetText obj 1 2)
    )
      )
    )
  )
)
Добавлено:
Что-то я видимо припозднился немного с советом-то. Ну да ладно, пусть будет.
А как можно получить общую размерность таблицы? (количество ячеек)
lexluther вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.08.2009, 12:50
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


(vla-get-rows), (vla-get-columns) - а вобще надо научиться пользоваться справкой по VB - методы и свойства в Lisp абсолютно такие же (по сути те же, только формат вызова лисповский). Посмотри по темам - много раз обсуждалось.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.12.2011, 15:07
#8
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,192


Как присвоить переменной значение ячейки, допустим А1 конкретной таблицы (известен ее ID)? Не могу разобраться с синтаксисом.
Добавлено:
Если в ячейке несколько слов через пробел, их по-хорошему бы заменить на неразрывный пробел (тот, что Alt+0160), а затем объявить переменную. Правильно мыслю?

Последний раз редактировалось skkkk, 14.12.2011 в 15:19.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.12.2011, 15:59
#9
Кулик Алексей aka kpblc
Moderator

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


skkkk, зачем уж так-то уж? Получай нужное значение (хотя бы так, как показал Makswell) и работай с ним. Зачем изобретать неизвестно что?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.12.2011, 16:06
#10
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,192


Алексей, это для решения вопроса из этой темы.
Это слишком трудоемко?
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.12.2011, 17:01
1 | #11
VVA

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
допустим А1 конкретной таблицы (известен ее ID)? Не могу разобраться с синтаксисом
По ID получить vla-object
Код:
[Выделить все]
;;;ObID - число, например 2130534448
(vla-objectidtoobject(vla-Get-ActiveDocument (vlax-Get-Acad-Object)) ObID)
;;;ObjID - строка, например "2130534448"
(vla-objectidtoobject(vla-Get-ActiveDocument (vlax-Get-Acad-Object))(read ObID))
Код:
[Выделить все]
(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 )
     (vla-GetText tblobj (1- row) (1-(Alpha2Number  col)))
     )
  (mip-string-text-and-number (strcase ExcellColumn))
  )
  )
(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
(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 mip-string-text-and-number (s)
;|
***************************************************************************************
*
* Программа разделяет строку на список текстовых и цифровых составляющих.
* Запятая между цифрами, зменяется на точечный разделитель дробной части.
* 
**************************************************************************************
*
* Написал Елпанов Евгений       (ElpanovEvgeniy)
* Тэги: строка число извлечь число цифры
* дата создания (13/10/2007 a 11:42)
* написано во время конкурса на форуме:
* http://www.cadxp.com/XForum+viewthread-fid-101-tid-16943-page-2.html
* http://forum.dwg.ru/showthread.php?p=285510#post285510
* http://forum.dwg.ru/showpost.php?p=677452&postcount=12
* http://www.theswamp.org/index.php?topic=22034.msg266541#msg266541
* http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/how-to-read-list-with-quotes-in-string/td-p/2365087/page/2
***************************************************************************************
* Пример использования и результатов работы:
* (str->list "point.25.4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.25,4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.3/8cm.")            => ("point." 0.375 "cm.")
* (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))))
           )
           (vl-list->string (reverse a))
          )
    )
   )
   (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))))
           )
           (str->list1 (list (car b)) (cdr b) nil)
     )
    )
   )
   (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)
    )
   )
  )
 )
 (setq s (vl-string->list s))
 (str->list1 (list (car s))
             (cdr s)
             (if (or (= (car s) 44) (< 45 (car s) 58))
              t
             )
 )
)
Цитата:
Сообщение от skkkk Посмотреть сообщение
Это слишком трудоемко?
Нет
Код:
[Выделить все]
(get_cell_value
  (vlax-ename->vla-object
    (car
      (entsel "\nВыберите таблицу")
      )
    )
  "A2"
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 14.12.2011 в 17:20.
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.12.2011, 20:10
#12
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,192


Если таблица создана на основе связи с данными Excel, get_cell_value вместе с текстом вытаскивает все управляющие символы форматирования. При создании связи нет возможности назначить формат создаваемой таблице - он берется из Excel. Если снести форматирование (например, сочетанием @+ctrl+пробел), остается \\H0.6111x, далее, если меняю высоту текста, начинает считывать то, что надо, т.е. только текст. После обновления связей формат исходной таблицы Excel возвращается, ячейка блокируется.
То есть для работы get_cell_value с таблицей, связанной с Excel нужно (программно):
1. Разблокировать нужную ячейку или таблицу
2. Снести форматирование
3. get_cell_value
Понятен пока только третий пункт
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.12.2011, 20:32
1 | #13
VVA

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


Пункты нужно поменять местами
1. get_sell_value
2. Unformat string
Пример
Код:
[Выделить все]
(LM:UnFormat
(get_cell_value
  (vlax-ename->vla-object
    (car
      (entsel "\nУкажите таблицу")
      )
    )
  "A2"
  )
 nil
)



UnFormat String
Код:
[Выделить все]
(defun LM:UnFormat ( str mtx / _Replace regex ) (vl-load-com)
  ;; © Lee Mac 2010
;;-------------------=={ UnFormat String }==------------------;;
;;                                                            ;;
;;  Returns a string with all formatting codes removed.       ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  str - String to Process                                   ;;
;;  mtx - MText Compatibility Flag                            ;;
;;        (Use T if String is destined for MText)             ;;
;;------------------------------------------------------------;;
;;  Returns:  String with formatting codes removed            ;;
;;------------------------------------------------------------;;
  
  (defun _Replace ( new old str )
    (vlax-put-property regex 'pattern old) (vlax-invoke regex 'replace str new)
  )
  (setq regex (vlax-get-or-create-object "VBScript.RegExp"))  
  (mapcar
    (function
      (lambda ( x ) (vlax-put-property regex (car x) (cdr x)))
    )
    (list (cons 'global actrue) (cons 'ignorecase acfalse) (cons 'multiline actrue))
  )
  (mapcar
    (function
      (lambda ( x ) (setq str (_Replace (car x) (cdr x) str)))
    )
   '(
      ("Р"       . "\\\\\\\\")
      (" "       . "\\\\P|\\n|\\t")
      ("$1"      . "\\\\(\\\\[ACcFfHLlOopQTW])|\\\\[ACcFfHLlOopQTW][^\\\\;]*;|\\\\[ACcFfHLlOopQTW]")
      ("$1$2/$3" . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
      ("$1$2"    . "\\\\(\\\\S)|[\\\\](})|}")
      ("$1"      . "[\\\\]({)|{")
    )
  )
  (setq str
    (if mtx
      (_Replace "\\\\" "Р" (_Replace "\\$1$2$3" "(\\\\[ACcFfHLlOoPpQSTW])|({)|(})" str))
      (_Replace "\\"   "Р" str)
    )
  )
  (vlax-release-object regex)
  str
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.12.2011, 20:39
#14
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,192


Получается!!! Гениально!
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.03.2018, 17:40
#15
Okl


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


НИЧЕГО НЕ РАБОТАЕТ(((

----- добавлено через ~1 мин. -----
нужно использовать коды из 13 поста? или с предыдущих тоже?

----- добавлено через ~8 мин. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
1. get_sell_value
2. Unformat string
Что это значит?
дайте пожалуйста исправленный код
Okl вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.03.2018, 21:38
#16
VVA

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


Цитата:
Сообщение от Okl Посмотреть сообщение
Что это значит?
Это значит, что был дан совет skkkk для его программ. Каких - нужно спрашивать у него.

Цитата:
Сообщение от Okl Посмотреть сообщение
нужно использовать коды из 13 поста?
Да, c #13 достаточно. Там приведен пример, вытаскивающий значение ячейки таблицы "А2".
Походе, что вы ищите некую готовую программу, а не помощь в фрагменте программы.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Возможно ли выцепить текст у таблиц? Как это можно реализовать на AutoLISP?

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Как изменить угол обзора в 3D? В Autocad'e это возможно? Li2n AutoCAD 17 12.11.2004 23:45
Программы для расчёта преднапряжённых ж.б. конструкций. ГОСТЬ Железобетонные конструкции 29 21.10.2004 13:49

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||