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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен лисп (пронизыватель лайаутов)

Нужен лисп (пронизыватель лайаутов)

Ответ
Поиск в этой теме
Непрочитано 17.07.2007, 17:26
Нужен лисп (пронизыватель лайаутов)
dextron3
 
проектировшик
 
СССР
Регистрация: 01.01.2007
Сообщений: 5,143

Описание:

Данный лисп позволяет выделять и вставлять текст одновременно сразу на все лайауты.
Если получится то можно сделать чтобы рисовал и удалял приметивы на всех лайаутах (вкладках) одновременно

т.е. открыл любой лайаут выделил область нажал ДЕЛ,
лисп удаляет эту область со всех лайаутов

или открыл любой лайаут вставил текст и текст автоматически вставился на всех лайаутах сколько бы их небыло в файле

Пример:

Выделите область для удаления <>
Нажмите Delete чтобы удалить данную область со всех лайаутов



Пример2:

Выделите объект<>
Нажмите Enter чтобы объект скопировался сквозь все лайауты



Для чего нужно:

Представьте что у вас 40 лайаутов и в каждом разбитый штамп,
а вам надо поменять фамилию, или название объекта



лисп сделает это за считанные доли секунды пример внизу

[ATTACH]1184678574.JPG[/ATTACH]

:roll: :roll: :roll: :roll: :roll:


Про блокирование надписей советы не принимаются :twisted:

:idea:

Если есть идея и алгоритм на 50% с задачей уже справились
__________________
инженер проектировшик с опттом программа авто гад образование высшие
Просмотров: 24330
 
Непрочитано 19.07.2007, 12:15
#61
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Profan
Лучше бы создать пронизыватель пространства-времени.
Запросто:
Код:
[Выделить все]
(defun continuum-penetrator (dpoint dtime / cont)
  (setq cont (vla-get-CurrentContinuum (vlax-get-myself)))
  (vla-put-Place
    cont
    (vlax-3d-point
      (mapcar (function +)
	      (vlax-safearray->list (vlax-variant-value (vla-get-Place cont)))
	      dpoint
      )
    )
  )
  (vla-put-Time cont (+ (vla-get-Time cont) dtime))
)
Вызов:
Код:
[Выделить все]
(continuum-penetrator '(1000000 200000 -3000) -40000)
Смещение в пространстве задаётся в виде 3-х дельт координат в мм, смещение во времени - в секундах.

*ВАРНИНГ* Толком не тестировал - претензии не принимаются!
Alaspher вне форума  
 
Непрочитано 19.07.2007, 12:28
#62
Кулик Алексей aka kpblc
Moderator

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


> Alaspher : Сэр, предупреждать о таких шутках надо. Еле вернулся.
> Олег К.:
Цитата:
IMHO: некоторые темы могут оказаться интересными и нужными (в начале темы уже говорил, что пришлось срочно изобретать нечто похожее).
Темы - могут. Но не постоянные требования "дайте то, подайте это, сделайте наоборот".
Цитата:
Если некто не хочет изучать ЛИСП и писать программы сам - его проблеммы. Но ведь на форуме не только гуру собрались, некоторые еще учатся. Хоть намеками давайте понять в каком направлении решать задачу или какие функции использовать.
Если человек хочет научиться, то хоть какие-то наметки по собственным разработкам обязательно будут показаны. Соответственно и подсказки посыплются. Тут же - ничего.
Намеков было достаточно. Не все и не всегда можно (и нужно) решать лиспом, иногда достаточно сделать всего один шаг - открыть тот же New Features и посмотреть там. В общем, "учить матчасть".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.07.2007, 12:45
#63
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Кулик Алексей aka kpblc
> Alaspher : Сэр, предупреждать о таких шутках надо. Еле вернулся.
Ну а шо-ж ви хочете от галимой беты? Вернулся-ж...

Цитата:
Сообщение от Кулик Алексей aka kpblc
Не все и не всегда можно (и нужно) решать лиспом, иногда достаточно сделать всего один шаг - открыть тот же New Features и посмотреть там.
Да, множество лиспов актуальных для 10-го АКАДа, стали совершенно ненужными сегодня. Аутодеск тож внимательно смотрит - что пишут независимые программеры чаще всего.
Alaspher вне форума  
 
Непрочитано 19.07.2007, 12:46
#64
Zouss


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


и добавить хоцца - даже то что можно решить лиспом, можно было бы для начала и поискать - скорее всего оно уже есть готовое
впрочем надо отдать должное - автор темы по крайней мере пытается четко изложить то что ему нужно
а нужно в общем случае нечто вроде "сканер визитных карточек", только на LISP под AutoCAD применительно к основной надписи - это блин сложная задача с коммерческим подоплеком
Zouss вне форума  
 
Непрочитано 19.07.2007, 14:27
#65
e_v_a


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


А еще можно viewport-ами чего-то аналогичного добиться. Т.е. на модели надписи, а в лайоутах окошки с этими надписями. Не думаю, что это хороший метод, но как вариант ...
e_v_a вне форума  
 
Непрочитано 19.07.2007, 14:48
#66
Геннадий aka PG

Машиностроение, Проектирование
 
Регистрация: 15.09.2003
Москва
Сообщений: 1,113
<phrase 1=


Цитата:
Сообщение от Alaspher
Цитата:
Сообщение от Profan
Лучше бы создать пронизыватель пространства-времени.
Запросто:
............
Вызов:
Код:
[Выделить все]
(continuum-penetrator '(1000000 200000 -3000) -40000)
Смещение в пространстве задаётся в виде 3-х дельт координат в мм, смещение во времени - в секундах.

*ВАРНИНГ* Толком не тестировал - претензии не принимаются!
Во-во, могильщик Вы наш, сначала б протестировали на кошечках!
Почему на 3метра в землю, за что?
Ведь пожить то хочется!
ЗЫ: Для тех кто там был и смог вернуться: Как там? Есть свет в конце тоннеля?
__________________
С уважением,
Геннадий aka PG
Геннадий aka PG вне форума  
 
Непрочитано 19.07.2007, 15:10
#67
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Геннадий aka PG
сначала б протестировали на кошечках!
Кошечки давно кончились - сразу вслед за мышками...

Цитата:
Сообщение от Геннадий aka PG
Почему на 3метра в землю, за что?
Ну, хороший лиспист, либо не попадётся, либо выкрутится... :twisted:
Alaspher вне форума  
 
Непрочитано 19.07.2007, 15:22
#68
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Ну, значит, я не попался... :P
Profan вне форума  
 
Непрочитано 19.07.2007, 16:58
#69
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> ВСЕМ (к посту 62)
С этим-то я согласен, просто темы сразу не убивайте. Это к тому, что здесь творится: то ли разделить на 3-4! темы, то ли наплевать и оставить как есть (ну это уже к модераторам).

Позвольте вернуться к основной теме.
Неужели ничего подобного никто не делал? Не помню чтобы это было в стандартных функциях КАДа или в экспресах (если есть - ткните носом!). Поиск в данлоде по словам "layout" и "лист" ничего не выдал, искать по таким параметрам на форуме просто страшно :wink: . Поиск на форуме по "операции с листами" выдал всего одну ссылку, если не лень сами посмотрите - оччень интересно. На AutoCAD.ru нашлась только "z_layout_number.lsp", но она работает с блоком. И все?

Простейшая задача: в файле два лайота/листа, на каждом надо удалить все объекты, попадающие в квадрат 0,0-10,10.
Как я это решил: составляется список листов и на каждом ssget секущей рамкой по координатам. Но нужно делать активным каждый лист и zoom-extents. Надеюсь и без лисп-кода понятно.
Можно ли это решить без активации каждого листа?
Олег К. вне форума  
 
Непрочитано 19.07.2007, 17:14
#70
Dym


 
Регистрация: 27.09.2005
Двинскъ
Сообщений: 586
Отправить сообщение для Dym с помощью Skype™


sheet set?
Dym вне форума  
 
Непрочитано 19.07.2007, 17:19
#71
Кулик Алексей aka kpblc
Moderator

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


> Олег К. : вопрос решается стандартными средствами - поля, sheetsetmanager (mitjaj опередил ) либо блоки.
Цитата:
на каждом [листе] надо удалить все объекты, попадающие в квадрат 0,0-10,10
Позвольте узнать, а на фига? Теоретически можно, проходя по всем листам, и потом по примитивам, лежащим в них, проверять "вхождение" boundingbox'a примитива в указанную область. Для проверки пересечений - наверное, надо будет построить одну (!) полилинию замкнутую, поместить ее на первый лист, проверить через intersectwith пересекаемость со всеми примитивами листа; выбрать и удалить те, с которыми она пересекается; потом через copyobjects, например, или через entmod 410-й группы перетащить ее на следующий лист и все сначала. Оно надо?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.07.2007, 18:46
#72
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Блоки и поля уже разобрали, с ними все понятно. Подшивки - надо посмотреть поближе, никогда не пользовался (отсталые мы :? )

>> "Кулик Алексей aka kpblc"
На фига? Во-первых, для самообразования. Как я понял, используются функции VBA - это для меня сложновато, не дорос еще. Получается простым ЛИСПом такая задача не решается.
Во-вторых, зачем это конкретно понадобилось: срочно в полностью готовые чертежи объекта по требованию заказчика нужно было вставить подписи исполнителей (раньше подписывали только "бумагу"), около 500 листов. В общем, набросал программу вставляющую блоки-подписи в графы штампа. В блоке-форматке находятся только линии и не меняющийся текст, все остальные надписи - текстом вне блока (да, есть у меня динамический блок-форматка с аттрибутами, и форматку с полями сделал, но их внедрение - отдельный разговор). Из блока можно узнать только точку вставки и размер формата; далее вычисляется где находится нужная графа штампа и ssget'ом из нее берется текст фамилии; ну и вставка нужного блока-подписи рядом.
Короче, не понравилось мне, не красиво, захотелось улучшить! А тут тема на форуме похожия возникла!
Олег К. вне форума  
 
Непрочитано 19.07.2007, 23:31
#73
Dym


 
Регистрация: 27.09.2005
Двинскъ
Сообщений: 586
Отправить сообщение для Dym с помощью Skype™


Цитата:
вставить подписи исполнителей
это вроде уже и не подпись
Dym вне форума  
 
Непрочитано 19.07.2007, 23:55
#74
Кулик Алексей aka kpblc
Moderator

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


Ну только если для самообразования
Кстати, о соответствии VBA <-> vl-расширение очень хорошо написано на http://www.cad.dp.ua/stats/vla_doc.php - для меня это вообще стартовая страница оочень долго была Благо VB(A) более-менее знакомо.
По поводу "во-вторых"... Черт, если бы не динамика блока, я бы посоветовал попробовать работать напрямую в него (то есть "подписи" зашарашивать напрямую в описание блока, это вполне реализуемо). Но в динамические блоки я не пробовал такое сделать, поэтому давай забудем про этот метод Поэтому у меня к тебе есть предложение: вышли файл "что было" и "что должно получиться", есть у меня идейка одна, может и сработает. И без ssget'a обойтись можно попробовать.
Понимаешь, из конкретной вставки блока (хоть простого, хоть динамического) можно получить все что угодно. Если известно имя блока, то задачка в общем-то упрощается. В целях "отладки и пояснения" код сделал в принципе не очень верным - в локальные переменные, в частности, не внес почти ничего
Код:
[Выделить все]
(defun test (/ adoc)
  (vl-load-com)
  (setq adoc           (vla-get-activedocument (vlax-get-acad-object))
        layouts        (vl-remove-if-not
                         (function (lambda (x / name)
                                     (setq name (vla-get-name x))
                                     (and (wcmatch (strcase name t) "*paper*")
                                          (= (substr name 1 1) "*")
                                          ) ;_ end of and
                                     ) ;_ end of lambda
                                   ) ;_ end of function
                         ((lambda (/ res)
                            (vlax-for item (vla-get-blocks adoc)
                              (setq res (cons item res))
                              ) ;_ end of vlax-for
                            res
                            ) ;_ end of lambda
                          )
                         ) ;_ end of vl-remove-if-not
        layout_blocks  (mapcar
                         '(lambda (x / res)
                            (vlax-for ent x
                              (if
          ;(and	; строку раскомментировать, если известно имя блока
                                (= (strcase (vla-get-objectname ent) t)
                                   "acdbblockreference"
                                   ) ;_ end of =
          ;(= (strcase (vla-get-name ent) t) "<имяблока>")
          ; И эту строку тоже, подставив вместо <имяблока> требуемое, в
          ; нижнем
          ; регистре
                                 (setq res (cons ent res))
                                 ) ;_ end of if
                              ) ;_ end of vlax-for
                            res
                            ) ;_ end of lambda
                         layouts
                         ) ;_ end of mapcar
        ;; На данный момент получен список типа
        ;; '((#<VLA-OBJECT IAcadBlockReference2 0ef773d4>
        ;;    #<VLA-OBJECT IAcadBlockReference2 0ef77494>)
        ;;   (#<VLA-OBJECT IAcadBlockReference2 0ef77104>
        ;;    #<VLA-OBJECT IAcadBlockReference2 0d60d204>))
        ) ;_ end of setq
  ) ;_ end of defun
А уж из оттуда можно попробовать и выцепить все что надобно. Без "пациента" делать рецепт тяжеловато...
---
Код отредактировал, убрал откровенные ляпы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.07.2007, 09:28
#75
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Алексей
Я-б немного упростил код (с минимальными переделками):
Код:
[Выделить все]
(vl-load-com)
(defun test (/ adoc res)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vlax-for i (vla-get-Layouts adoc)
    (if (= :vlax-false (vla-get-ModelType i))
      (vlax-for ent (vla-get-Block i)
        (if                             ;(and   ; строку раскомментировать, если известно имя блока 
          (= (strcase (vla-get-objectname ent) t) "acdbblockreference") ;_ end of = 
                                        ;(= (strcase (vla-get-name ent) t) "<имяблока>") 
                                        ; И эту строку тоже, подставив вместо <имяблока> требуемое, в 
                                        ; нижнем 
                                        ; регистре 
           (setq res (cons ent res))
        )
      )
    )
  )
  res
)
Если я правильно понял смысл его работы...
Alaspher вне форума  
 
Непрочитано 20.07.2007, 09:40
#76
Кулик Алексей aka kpblc
Moderator

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


Ни себе чего... Обалдеть можно как красиво!
Я ушел в другой мир, посыпать голову пеплом и жалеть себя
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.07.2007, 09:48
#77
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Сенкс!
По сути, это просто развитие твоего кода.

Надолго не пропадай. 8)
Alaspher вне форума  
 
Непрочитано 20.07.2007, 10:17
#78
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> Кулик Алексей aka kpblc, Alaspher
Стоп, стоп, стоп. Я в таком темпе работать не могу - основной работы до черта. Хоть и подключен все время к форуму, бывает за день даже в список тем некогда заглянуть.
Вы правы, без примеров не получится, постараюсь за выходные собрать все необходимое (прогу подредактировать придется), в понедельник выложу сюда. Мне уже не горит, просто интересно.

Насколько я понимаю, подписи в виде полилиний/сплайнов в эл.чертежах юридической силы не имеют (речь о формате dwg). Или у нас с законодательством настолько глухо, что вообще непонятно? Знаю что была подобная тема, но там про электронную подпись спрашивали и ни к чему не пришли.
Олег К. вне форума  
 
Непрочитано 23.07.2007, 10:46
#79
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


В прицепленном архиве сама прога и необходимые файлы, краткие пояснения в текстовике. Три файла с блоками форматов - просто посмотреть, можно ли с такими работать.

Программа была написана "по-быстрому" для себя, поэтому использовал только те функции в которых уверен и отсутствуют некоторые проверки.
Собственно вопрос: можно ли в данной ситуации избавиться от SSGETa и соотв не перебирать листы? Да и вообще интересны рекомендации.
[ATTACH]1185173197.rar[/ATTACH]
Олег К. вне форума  
 
Непрочитано 23.07.2007, 23:38
#80
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


"Пройти" по листам не активируя их можно. В том числе можно и оперировать примитивами. Простейший пример прохода есть в постах 74 и 75. Там происходит выборка вставок блоков, но это не принципиально - можно обработать любой примитив. Из описания примитива можно выдернуть всё что нужно. Это, что касается активации и ssget - и то и другое можно обойти.

В той программе, которая сейчас сделана, есть одна проблема - она сделана "по-быстрому, для себя", то есть любая переделка сразу приведёт к эффекту домино - всё посыплется. Собственно, если браться за переделку, то переделывать надо почти всё, иначе лучше не мучаться - работает и слава богу. В конце концов, может лучше написать чтонибудь совсем другое, что ещё не автоматизировано.

В блоках, всё может быть и так - опять же критерий правильности - работоспособность и удобство. С точки зрения чистоты решения, я бы предпочёл, во первых - выделить штампы в отдельный блок (не динамик), а во вторых - неизменную (в каждом файле) часть сделать постоянными атрибутами, а изменяемую обычными. Многострочные надписи можно сделать и мультисторочным текстом (при изменении переопределять блок). Можно, не значит - нужно.

Но повторю - если работает и устраивает, то лучше потратить время на другую задачу. Через год - другой может многое поменяться и не факт, что понадобится эта программа.
Alaspher вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен лисп (пронизыватель лайаутов)

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

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