|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
поля в таблице.
Регистрация: 24.03.2005
Сообщений: 320
|
||
Просмотров: 6366
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Поищи на этом форуме - решения были, правда, достаточно давно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
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-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.03.2005
Сообщений: 320
|
Наверно, это не то, что нужно. Местами я не понимал в чем суть. Но ведь люди хвалили эти лиспы…
Еще вопрос, каждому объёкту как я понял, присваивается номер: ObjId 2130526720 ObjId 2130528112 Так он выглядит в полях, а так: 7efd4200 из какого-то встроенного Лиспа. Как узнать закономерность? У 2 взаимно идущих отрезков офтопик: начал копировать лиспы, а они в опере в одну строчку идут, если скопировать с ie6, то все хорошо. Где собака зарыта? у меня, на форуме или с оперой косяки |
|||
![]() |
|
||||
Регистрация: 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. Затем руками, реже Лиспом переносил длину (материал, глубину заложения и т.д) в Эксель для дальнейшей обработки. Сейчас я немножко поумнел и хочу таблицы составлять прямо в акаде, ведь при малейшем редактирование все сразу автоматом пересчитывается. |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
Ну, если интересно про энти цифирь... ENAME называются. Они возрастают с шагом 2 (два) при внесении в базу данных чертежа каждого нового примитива, притом, неважно что это за примитив. Это первый момент.
При каждом следующем открытии этого же чертежа они вовсе не обязаны принимать те же значения что и при предыдущем, особенно, если были удалены ранее отрисованные примитивы. Так что, полагаться на них не следует. Есть еще HANDLE - 5 группа DXF. Оно немного надежнее (не меняется от открытия к открытию чертежа), но только до тех пор, пока данный чертеж не попал в состав другого чертежа (тогда дубликаты будут заменены). Немного не улавливаю сути проблемы. Подозреваю, что вместе с примитивом (отрезком к примеру) Вам нужно хранить еще какие то данные, чтоб их можно было использовать при построении таблицы? Если так, то попробуйте записывать эти данные (номер трассы, материал, глубину) в расширенные данные примитива. Тогда при составлении таблицы можно будет вернуть данные "закрепленные" за примитивом. |
|||
![]() |
|
||||
Регистрация: 24.03.2005
Сообщений: 320
|
Цитата:
Легко сказать «вернуть» . ЭТО как??? Мне бы не расширенные, мне бы простые «вернуть». Ведь можно каким дизелем , Лиспом взять из примитива его номер ( 2130488048 ), затем сделать с него поле (%<\AcObjProp Object(%<\_ObjId 2130488048>%).Length>% ) и (создать) и вставить его (поле) в таблицу , в любую ячейку |
|||
![]() |
|
||||
Регистрация: 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))), чтоб он выдавал лишь нужное имя примитива? |
|||
![]() |
|
||||
Посмотри здесь: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=19827ea
Возможно там уже есть решение твой проблемы. |
||||
![]() |
|
||||
Регистрация: 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)) ) |
|||
![]() |
|
||||
Вообще-то я имел в виду этот код:
Код:
Код:
А так - чтобы сразу печатался полный текст поля: Код:
|
||||
![]() |
|
||||
Регистрация: 29.10.2005
Нижегородская обл.
Сообщений: 219
![]() |
От меня тоже громаднейшее спасибо, оч полезная штукенция сразу взял себе на вооружение. Сам в лиспе не особо силён, пожинаю плоды других...всё как-то некогда, да и хватало стандартных инструментов; но глядя на Вас обязательно усядусь за этот велосипед поудлбнее
![]() Лисп рулит! http://dwg.ru/forum/viewtopic.php?t=6353 Вот сейчас, к примеру, не хватает (думал решится стандартно)... в общем сталкнулся с такой какой (план был такой): -в окне редактора блоков (динамический блок) сделал таблицу, в каждую ячеку которой вбил поля с длинами нужных отрезков; -вставил атрибут, задав в строке Value формулу в виде поля для подсчёта суммы строк таблицы, поставил галку невидимый атрибут; -сохранил и вышел из редактора; -2 раза щёлкнул по блоку, и о чудо-эта сумма была на месте; -стал дёргать за маркеры, и на этом моя радость закончилась (update, regen не реагируют). Хотца шоб эта сумма подсчитывалась после изменения длины за маркеры. Вот Не знаю как и сообразить ![]() Упоминалось ENAME и HANDLE, но я это впервый раз услышал. Есть вариант потом это разбивать и делать сплошную полилинию (join), но это не серьёзно. Я вот хотел узнать эта задумка ваще миф или реальность? |
|||
![]() |
|
||||
Регистрация: 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 перед отправкой сообщения я вдруг подумал, что этот лисп может получить более широкое распространение, т.е нужным не только для меня, если Вы предусмотрите возможность заточки этого Лиспа под другие поля. Ведь вероятно кому-то еще понадобится вставлять в ячейки тип линии, имя, имя слоя, уровень и т.д . А кому-то еще атрибут захочется втиснуть или блок вписать в ячейку, или просто текст. |
|||
![]() |
|
||||
Цитата:
![]() Цитата:
![]() Цитата:
P.S.: Рад, что мой труд не пропал даром. ![]() |
||||
![]() |
|
||||
Регистрация: 24.03.2005
Сообщений: 320
|
У отрезков нет свойства Area. Поэтому и решетки.
Я что-то не понимаю, а причём тут отрезки. Я полилинией чертил квадрат. Ведь у pl есть площадь, даже у незамкнутой. Зачем десяток вопросов. Как я это вижу со своей ламерской колокольни: Первым делом спрашивается: - введите код поля. И вводим, то, что нам надо, например: %<\AcObjProp Object(%<\_ObjId 0000000000>%).TextString>% (или другое, например %<\AcVar CreateDate \f "d-MMM-yy">%) Далее все как у ВАС: Выберите таблицу; Выберите объект; Выберите ячейку. В следующем цикле пропускаем первый пункт, достаточно нажать пробел. Или первый пункт появляются лишь при первом запуске Лиспа. Хочешь новое поле – запускай еще раз лисп. Да можно и второй пункт пропустить. Достаточно единожды выбрать таблицу. А ежели что-то некорректное выбрано, типа как площадь у текста. То решетки. Зы Я не слишком назойлив ![]() |
|||
![]() |