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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > поля в таблице.

поля в таблице.

Ответ
Поиск в этой теме
Непрочитано 14.02.2006, 13:54 #1
поля в таблице.
Neznayka
 
Регистрация: 24.03.2005
Сообщений: 320

как сделать так , чтоб щёлкнуть по объекту, а его длина отобразилась в ячейке
в ручную долго, есть ли здесь пути для автоматизации?
Просмотров: 6366
 
Непрочитано 14.02.2006, 13:57
#2
Кулик Алексей aka kpblc
Moderator

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


Поищи на этом форуме - решения были, правда, достаточно давно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.02.2006, 14:36
#3
Neznayka


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


а как составить синтаксис запроса?
Я в поиск по полям давал - глухо.
Или это не полями решается
С надеждой жду
И как давно, ведь раньше и таблиц то небыло
Neznayka вне форума  
 
Непрочитано 14.02.2006, 14:50
#4
Кулик Алексей aka kpblc
Moderator

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


Это не то?
http://dwg.ru/forum/viewtopic.php?t=1465
http://dwg.ru/forum/viewtopic.php?t=5881
http://dwg.ru/forum/viewtopic.php?t=1841
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.02.2006, 15:43
#5
Neznayka


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


Я идиот :evil: я запрос по-русски формулировал.
Буду разгребать.
Спасибо
Neznayka вне форума  
 
Автор темы   Непрочитано 14.02.2006, 16:38
#6
Neznayka


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


Наверно, это не то, что нужно. Местами я не понимал в чем суть. Но ведь люди хвалили эти лиспы…
Еще вопрос, каждому объёкту как я понял, присваивается номер:
ObjId 2130526720
ObjId 2130528112
Так он выглядит в полях, а так:
7efd4200 из какого-то встроенного Лиспа.
Как узнать закономерность? У 2 взаимно идущих отрезков

офтопик:
начал копировать лиспы, а они в опере в одну строчку идут, если скопировать с ie6, то все хорошо. Где собака зарыта? у меня, на форуме или с оперой косяки
Neznayka вне форума  
 
Непрочитано 14.02.2006, 18:05
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Neznayka
ObjId 2130526720
ObjId 2130528112
Так он выглядит в полях, а так:
7efd4200 из какого-то встроенного Лиспа.
Как узнать закономерность?
Код:
[Выделить все]
7efd4200 = 2130526720
   HEX         DEC
PS Лиспа не обижай, да
vk вне форума  
 
Автор темы   Непрочитано 14.02.2006, 23:46
#8
Neznayka


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


Да я сразу понял, что надо перевести в 16-ную систему, просто лень было.
Итак, в новом чертеже я создал 4 полилинии:
Первые 3 одинаковы, только разнесены по X на 50 единиц; 4 - произвольная линия; 5- тоже, но в другом слое. И что обидно, я не вижу никакой логики в нумерации, кроме той, что местами через 8 номера идут

1. 7ef71d78 2130124152
2. 7ef71db8 2130124216
3. 7ef71dc0 2130124224
4. 7ef71dc8 2130124232
5. 7ef71dd8 2130124248

Может, я попытаюсь объяснить, зачем мне это нужно и у кого-то может есть более правильные решения.
Итак, есть огромное нефтехранилище, в котором только одних технологических трубопроводов 22 км. Мне надо со схемы изобразить реально! на плане местности всю эту паутину. Как я делал раньше: линиями чертил трубу от резервуара №1 к рез. №2. Затем руками, реже Лиспом переносил длину (материал, глубину заложения и т.д) в Эксель для дальнейшей обработки. Сейчас я немножко поумнел и хочу таблицы составлять прямо в акаде, ведь при малейшем редактирование все сразу автоматом пересчитывается.
Neznayka вне форума  
 
Непрочитано 15.02.2006, 00:40
#9
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Ну, если интересно про энти цифирь... ENAME называются. Они возрастают с шагом 2 (два) при внесении в базу данных чертежа каждого нового примитива, притом, неважно что это за примитив. Это первый момент.
При каждом следующем открытии этого же чертежа они вовсе не обязаны принимать те же значения что и при предыдущем, особенно, если были удалены ранее отрисованные примитивы. Так что, полагаться на них не следует. Есть еще HANDLE - 5 группа DXF. Оно немного надежнее (не меняется от открытия к открытию чертежа), но только до тех пор, пока данный чертеж не попал в состав другого чертежа (тогда дубликаты будут заменены).

Немного не улавливаю сути проблемы. Подозреваю, что вместе с примитивом (отрезком к примеру) Вам нужно хранить еще какие то данные, чтоб их можно было использовать при построении таблицы? Если так, то попробуйте записывать эти данные (номер трассы, материал, глубину) в расширенные данные примитива. Тогда при составлении таблицы можно будет вернуть данные "закрепленные" за примитивом.
vk вне форума  
 
Автор темы   Непрочитано 15.02.2006, 14:54
#10
Neznayka


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


Цитата:
Сообщение от vk

Немного не улавливаю сути проблемы. Подозреваю, что вместе с примитивом (отрезком к примеру) Вам нужно хранить еще какие то данные, чтоб их можно было использовать при построении таблицы? Если так, то попробуйте записывать эти данные (номер трассы, материал, глубину) в расширенные данные примитива. Тогда при составлении таблицы можно будет вернуть данные "закрепленные" за примитивом.
Расширенные данные это хорошо, но я еще слаб для них. Меня пока интересует только длина отрезка, вернее автоматический экспорт длины в таблицу, а все остальное я могу и руками внести или тот же материал взять со слоя.
Легко сказать «вернуть» . ЭТО как??? Мне бы не расширенные, мне бы простые «вернуть».
Ведь можно каким дизелем , Лиспом взять из примитива его номер ( 2130488048 ), затем сделать с него поле (%<\AcObjProp Object(%<\_ObjId 2130488048>%).Length>% ) и (создать) и вставить его (поле) в таблицу , в любую ячейку
Neznayka вне форума  
 
Автор темы   Непрочитано 15.02.2006, 21:44
#11
Neznayka


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


Итак, я все сделал сам. Можно тему закрывать.
Если кому интересно, то я расскажу как, ежели не интересно, то до свидания
Сделал я все криво, через конкретную жопу (вот к чему приводит незнание Лиспа
В палитрах акада (crtl+3) есть встроенный заводом лисп (entget (car (entsel))) при своей работе он вытягивает из примитива всю подноготную в таком виде:
Команда: (entget (car (entsel)))
Выберите объект: ((-1 . <Имя объекта: 7ec81f78>) (0 . "LWPOLYLINE") (330 . <Имя
объекта: 7ec81cf8>) (5 . "EF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8
. "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 .
0.0) (10 -78.943 447.841) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 146.593 337.929)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))
Но мне лишь надо имя. И так запускал для каждого нужного примитива. Затем в командной строке скопировал протокол. И вставил в ворд . И выдилил (с нажатым ALT) лишь только имя каждого примитива. Далее вставил в эксель:
7ec81f78
7ecbe000
7ecbe010
7ecbe020
Это командой =HEX2DEC(A1) перевел в 10-ную систему понятную для поля:
2127044472
2127290368
2127290384
2127290400
Потом командами =+ЛЕВСИМВ(C1;30) и =+ПРАВСИМВ(C1;12) и & соединил до нормального, нужного кода поля:
%<\AcObjProp Object(%<\_ObjId 2127044472>%).Length>%
%<\AcObjProp Object(%<\_ObjId 2127290368>%).Length>%
%<\AcObjProp Object(%<\_ObjId 2127290384>%).Length>%
%<\AcObjProp Object(%<\_ObjId 2127290400>%).Length>%

Далее в Автокад специальной вставкой как родные объекты получил долгожданную таблицу.
Все.
Ps как бы «обработать напильником» лисп (entget (car (entsel))), чтоб он выдавал лишь нужное имя примитива?
Neznayka вне форума  
 
Непрочитано 15.02.2006, 22:57
#12
Александр Ривилис

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


Посмотри здесь: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=19827ea
Возможно там уже есть решение твой проблемы.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 16.02.2006, 21:37
#13
Neznayka


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


Спасибо за лисп, но его нельзя сделать так чтоб он снова запускался по нажатию пробела, а то запустил – он сделал своё дело, а затем снова его запускай.

(progn
(setq en (car (entsel)))
(setq e (entget en))
(setq s (vl-princ-to-string (cdr (assoc -1 e))))
(setq s (substr s (1+ (vl-string-position (ascii ":") s))))
(setq s (vl-string-trim " :<>" s))
)
Neznayka вне форума  
 
Непрочитано 16.02.2006, 22:48
#14
Александр Ривилис

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


Вообще-то я имел в виду этот код:
Код:
[Выделить все]
(defun C:ChgTxtFld ( / en s s1)
  (vl-load-com)
  (defun HexToDec (hexstr / n s i a)
   (setq n 0 i 0)
   (setq hexstr (strcase hexstr))
   (while (> (strlen hexstr) 0)
     (setq s (substr hexstr (strlen hexstr) 1) a (ascii s))
     (cond
      ((<= (ascii "0") a (ascii "9")) (setq a (- a (ascii "0"))))
      ((<= (ascii "A") a (ascii "F")) (setq a (+ 10 (- a (ascii "A")))))
     ) ;; (cond
     (setq n (+ n (* a (expt 16 i))) i (1+ i))
     (setq hexstr (substr hexstr 1 (1- (strlen hexstr))))
   )
   (rtos n 2 0)
  )
  (if (setq en (car
         (entsel "\nВыберите текст-источник: " )))(progn
    (setq s  (vl-princ-to-string (cdr (assoc -1 (entget en)))))
    (setq s  (substr s (1+ (vl-string-position (ascii ":") s))))
    (setq s  (vl-string-trim " :<>" s))
    (setq s  (HexToDec s))
    (setq s  (strcat "%<\\AcObjProp Object(%<\\_ObjId " s ">%).TextString>%"))
    (if (setq en (car
         (entsel "\nВыберите текст-приемник: " ))) (progn
      (setq e (entget en))
      (if (setq s1 (cdr (assoc 1 e))) (progn
        (entmod (subst (cons 1 s) (assoc 1 e) e)) (entupd en)
      )) ;; (if (progn
    ))
  )) ;; (if (progn
)
Но если нужно просто напечатать в командной строке AutoCAD ID примитива, то можно воспользоваться и такой командой:
Код:
[Выделить все]
(defun C:EID ( / )
 (vl-load-com)
 (vla-get-objectid (vlax-ename->vla-object (car (entsel))))
)
Запускается командой EID
А так - чтобы сразу печатался полный текст поля:
Код:
[Выделить все]
(defun C:PFLD ( / en)
  (if (setq en (car (entsel))) (progn
    (princ (strcat "\n"
      "%<\\AcObjProp Object(%<\\_ObjId "
      (vl-princ-to-string (vla-get-objectid (vlax-ename->vla-object en)))
      ">%).Length>%"
    ))
  )) ;_endof if progn 
  (princ)
) ;_endof defun
Запускается командой PFLD
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 17.02.2006, 14:30
#15
Neznayka


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


Огромное спасибо за последний ЛИСП
Neznayka вне форума  
 
Непрочитано 17.02.2006, 15:10
#16
Александр Ривилис

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


Цитата:
Сообщение от Neznayka
Огромное спасибо за последний ЛИСП
:-D А за этот?
Код:
[Выделить все]
(defun C:LNG2TLB ( / en obj s row col) 
  (vl-load-com)
  (cond
   ((and (setq en (car (entsel "\nВыберите таблицу: ")))
         (= (cdr (assoc 0 (entget en))) "ACAD_TABLE"))
    (setq obj (vlax-ename->vla-object en))
    (while (and (setq en (car (entsel "\nВыберите линию (ENTER - завершение): " )))
                 (wcmatch (cdr (assoc 0 (entget en))) "*LINE"))
      (setq s (strcat 
        "%<\\AcObjProp Object(%<\\_ObjId "
        (vl-princ-to-string (vla-get-objectid (vlax-ename->vla-object en)))
        ">%).Length>%"
      ))
      (if (setq p (getpoint "\nУкажите ячейку таблицы: " ))(progn
        (if  (= :vlax-true (vla-HitTest obj
          (vlax-3d-point (trans p 1 0)) (vlax-3d-point (trans (getvar "VIEWDIR") 1 0)) 'row 'col))
         (vla-SetText obj row col s)
        )
      )) ;_endof if progn             
    )
   )
   (t
     (princ "\nЭто не таблица!")
   )
  )
  (princ)
)
Александр Ривилис вне форума  
 
Непрочитано 17.02.2006, 18:56
#17
pyatifan


 
Регистрация: 29.10.2005
Нижегородская обл.
Сообщений: 219
<phrase 1=


От меня тоже громаднейшее спасибо, оч полезная штукенция сразу взял себе на вооружение. Сам в лиспе не особо силён, пожинаю плоды других...всё как-то некогда, да и хватало стандартных инструментов; но глядя на Вас обязательно усядусь за этот велосипед поудлбнее
Лисп рулит!
http://dwg.ru/forum/viewtopic.php?t=6353
Вот сейчас, к примеру, не хватает (думал решится стандартно)... в общем сталкнулся с такой какой (план был такой):

-в окне редактора блоков (динамический блок) сделал таблицу, в каждую ячеку которой вбил поля с длинами нужных отрезков;
-вставил атрибут, задав в строке Value формулу в виде поля для подсчёта суммы строк таблицы, поставил галку невидимый атрибут;
-сохранил и вышел из редактора;
-2 раза щёлкнул по блоку, и о чудо-эта сумма была на месте;
-стал дёргать за маркеры, и на этом моя радость закончилась (update, regen не реагируют).

Хотца шоб эта сумма подсчитывалась после изменения длины за маркеры. Вот

Не знаю как и сообразить
Упоминалось ENAME и HANDLE, но я это впервый раз услышал.
Есть вариант потом это разбивать и делать сплошную полилинию (join), но это не серьёзно.

Я вот хотел узнать эта задумка ваще миф или реальность?
pyatifan вне форума  
 
Непрочитано 17.02.2006, 22:28
#18
pyatifan


 
Регистрация: 29.10.2005
Нижегородская обл.
Сообщений: 219
<phrase 1=


Ура, я тож сам разобрался;
Таблицы тут не катят; достаточно элементарного знака сложения и галочку надо ставить "Dysplay value for block reference" вот и всё. Эт я одну хорошую тему перечитал внимательно...
pyatifan вне форума  
 
Автор темы   Непрочитано 18.02.2006, 10:58
#19
Neznayka


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


Это превзошло все мои ожидания!
Вы, вы гений.
Если бы я год назад или больше был бы чуточку умней, и Вы бы мне попались со своим Лиспом… Наш отдел наверно за неделю только один день тратит на тупой экспорт длин в таблицы Экселя. И я уже вообще подумываю отказаться от Экселя.

Спасибо!

Пробовал приспособить под подсчёт площади заменой:
"%<\\AcObjProp Object(%<\\_ObjId "
(vl-princ-to-string (vla-get-objectid (vlax-ename->vla-object en)))
">%).Length>%"
На:
"%<\\AcObjProp Object(%<\\_ObjId "
(vl-princ-to-string (vla-get-objectid (vlax-ename->vla-object en)))
">%).Area>%"

Только решетки. Не получилось. Да ладно не очень то и хотелось.
Еще раз спасибо.

Ps
перед отправкой сообщения я вдруг подумал, что этот лисп может получить более широкое распространение, т.е нужным не только для меня, если Вы предусмотрите возможность заточки этого Лиспа под другие поля. Ведь вероятно кому-то еще понадобится вставлять в ячейки тип линии, имя, имя слоя, уровень и т.д . А кому-то еще атрибут захочется втиснуть или блок вписать в ячейку, или просто текст.
Neznayka вне форума  
 
Непрочитано 18.02.2006, 11:07
#20
asys

архитектор
 
Регистрация: 10.08.2005
Ростов-на-Дону
Сообщений: 5,342


>Александр Ривилис
От меня тоже огромное спасибо. Отличная работа :P
asys вне форума  
 
Непрочитано 18.02.2006, 13:15
#21
Александр Ривилис

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


Цитата:
Сообщение от Neznayka
Это превзошло все мои ожидания!
Вы, вы гений.
Да ладно! Вы преувеличиваете...

Цитата:
Сообщение от Neznayka
Пробовал приспособить под подсчёт площади заменой:
"%<\\AcObjProp Object(%<\\_ObjId "
(vl-princ-to-string (vla-get-objectid (vlax-ename->vla-object en)))
">%).Length>%"
На:
"%<\\AcObjProp Object(%<\\_ObjId "
(vl-princ-to-string (vla-get-objectid (vlax-ename->vla-object en)))
">%).Area>%"

Только решетки. Не получилось.
У отрезков нет свойства Area. Поэтому и решетки.

Цитата:
Сообщение от Neznayka
... этот лисп может получить более широкое распространение, т.е нужным не только для меня, если Вы предусмотрите возможность заточки этого Лиспа под другие поля. Ведь вероятно кому-то еще понадобится вставлять в ячейки тип линии, имя, имя слоя, уровень и т.д . А кому-то еще атрибут захочется втиснуть или блок вписать в ячейку, или просто текст.
Универсально "заточить" его не получится. Считайте, что это простенький образец для создания собственных команд по работе с полями и ячейками таблицы. А делать "монстра", который будет делать все, но для этой цели понадобится отвечать на десяток вопросов, я не вижу смысла.

P.S.: Рад, что мой труд не пропал даром.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 18.02.2006, 15:44
#22
Neznayka


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


У отрезков нет свойства Area. Поэтому и решетки.

Я что-то не понимаю, а причём тут отрезки. Я полилинией чертил квадрат. Ведь у pl есть площадь, даже у незамкнутой.

Зачем десяток вопросов. Как я это вижу со своей ламерской колокольни:
Первым делом спрашивается:
- введите код поля.
И вводим, то, что нам надо, например:
%<\AcObjProp Object(%<\_ObjId 0000000000>%).TextString>%

(или другое, например %<\AcVar CreateDate \f "d-MMM-yy">%)

Далее все как у ВАС:
Выберите таблицу;
Выберите объект;
Выберите ячейку.

В следующем цикле пропускаем первый пункт, достаточно нажать пробел.
Или первый пункт появляются лишь при первом запуске Лиспа. Хочешь новое поле – запускай еще раз лисп.
Да можно и второй пункт пропустить. Достаточно единожды выбрать таблицу.

А ежели что-то некорректное выбрано, типа как площадь у текста. То решетки.
Зы Я не слишком назойлив
Neznayka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > поля в таблице.