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

Вернуться   Форум 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% с задачей уже справились
__________________
инженер проектировшик с опттом программа авто гад образование высшие
Просмотров: 24331
 
Непрочитано 23.07.2007, 23:49
#81
Кулик Алексей aka kpblc
Moderator

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


ИМХО, ИМХО... Без проверок (попросту не было времени) и тестировок. Олег, попробуй код (но учти, за последствия не отвечаю! )
Код:
[Выделить все]
(defun test (lst / adoc attr_lst ins add_lst loc:getprop loc:conv2string)
            ;|
*	lst -> список соответствия вида:
      '(("family1" "<ИмяБлокаПодписиДляФамилии1> [<Смещение,мм>])
        ("family2" "<ИмяБлокаПодписиДляФамилии2> [<Смещение,мм>])
        <...>
        )
*    Маски символов (?, * и т.п.) недопустимы. Регистр роли не играет
*    Если блок "подписи" не существует в чертеже, он исключается из обработки.
* Неуказанные значения смещений принимаются = 20.
*    Написано с использованием кода Alaspher (http://dwg.ru/forum/viewtopic.php?t=14627)
|;
  (defun loc:getprop (ent prop / res)
    (if (vlax-property-available-p ent prop)
      (vlax-get-property ent prop)
      ) ;_ end of if
    ) ;_ end of defun

  (defun loc:conv2string (value)
    (if value
      (vl-princ-to-string value)
      ""
      ) ;_ end of if
    ) ;_ end of defun

  (defun loc:conv2real (value)
    (atof (loc:conv2string value))
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (setq
    lst (mapcar
          '(lambda (x)
             (list (strcase (car x))
                   (strcase (cadr x))
                   (cond
                     ((caddr x))
                     (t 20.)
                     ) ;_ end of cond
                   ) ;_ end of list
             ) ;_ end of LAMBDA
          (vl-remove-if-not '(lambda (a) (tblobjname "block" (cadr a))) lst)
          ) ;_ end of mapcar
    ) ;_ end of setq
  (vlax-for lay (vla-get-layouts adoc)
    (if (equal :vlax-false (vla-get-modeltype lay))
      (vlax-for blk (vla-get-block lay)
        (if
          (and
            (= (strcase (vla-get-objectname blk) t) "acdbblockreference")
            (or (wcmatch
                  (strcase (loc:conv2string (loc:getprop blk 'effectivename)) t)
                  "*format*"
                  ) ;_ end of wcmatch
                (wcmatch (strcase (vla-get-name blk) t) "*format*")
                ) ;_ end of or
            (> (vlax-safearray-get-u-bound
                 (setq attr_lst (vlax-variant-value (vla-getattributes blk)))
                 1
                 ) ;_ end of vlax-safearray-get-u-bound
               0
               ) ;_ end of >
            ) ;_ end of and
           (progn
             (foreach attr
                      (vl-remove-if-not
                        '(lambda (x)
                           (member (strcase (vla-get-tagstring x))
                                   (mapcar '(lambda (a) (strcase (car a))) lst)
                                   ) ;_ end of member
                           ) ;_ end of lambda
                        (vlax-safearray->list attr_lst)
                        ) ;_ end of vl-remove-if-not
               (setq ins     (vlax-safearray->list
                               (vlax-variant-value (vla-get-insertionpoint attr))
                               ) ;_ end of vlax-safearray->list
                     add_lst (cdr (assoc (strcase (vla-get-tagstring attr)) lst))
                     ) ;_ end of setq
               (vla-insertblock
                 (vla-objectidtoobject adoc (vla-get-ownerid blk))
                 (vlax-3d-point
                   (list (+ (cadr add_lst) (car ins))
                         (cadr ins)
                         (caddr ins)
                         ) ;_ end of list
                   ) ;_ end of vlax-3d-point
                 (car add_lst)
                 (max (loc:conv2real (loc:getprop blk 'xeffectivescalefactor))
                      (vla-get-xscalefactor blk)
                      ) ;_ end of max
                 (max (loc:conv2real (loc:getprop blk 'yeffectivescalefactor))
                      (vla-get-yscalefactor blk)
                      ) ;_ end of max
                 (max (loc:conv2real (loc:getprop blk 'zeffectivescalefactor))
                      (vla-get-zscalefactor blk)
                      ) ;_ end of max
                 (vla-get-rotation blk)
                 ) ;_ end of vla-InsertBlock
               ) ;_ end of foreach
             ) ;_ end of progn
           ) ;_ end of if
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Я код не тестировал совершено! Написано на 2007, должно работать начиная с 2006 и выше.
> Alashper : У Олега задача, как я понял, достаточно проста. Надо вычислить для каждого блока форматки (а маска *format*) атрибуты фамилий (маска family[0-9]) и по указанному смещению (20) поставить на каждую фамилию свой блок "подписи".
P.S. Если задачка не та, то сорри.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.07.2007, 06:47
#82
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Задача-то по изменению части основных надписей актуальная. Очень часто в последний момент что-то изменяется, например наименование стройки или обозначение. И надо быстро изменить.

Но решать надо принципиально не так, как в исходной "постановке". Это "строительство моста вдоль реки".

1. Основную надпись надо делать только блоками - обычными, не динамическими, не связывая с рамками. Вариантов блоков несколько - по ГОСТ.

2.Блоки с фиксированными именами.

3. Вся переменная часть - в атрибутах. Никаких многострочных и простых текстов. Количество атрибутов соответствует количеству строк - для наименования стройки - три атрибута и т.д.

При соблюдении этих условий задача изменения (и не только эта) решается легко, причем независимо от того, где нарисованы "штампы" - в модели или в лэйоутах. И независимо от версии Автокада.

Выбираются блоки с известными именами и в них изменяются значения известных атрибутов. Все делается функцией, в которую требуемые замены передаются аргументами.

Для универсальности данные лучше поместить во внешний файл. В ruCAD форматки рисуются программно, "штампы" в блоках. В папках проекта лежат файлы format.ini, в которых все записано. Изменив, например, название объекта, можно "щелкнуть по кнопке" и изменить, в соответствии с образцом, все основные надписи.

Задачу надо правильно ставить изначально, чтобы потом не изощряться в "пронизывании".
ShaggyDoc вне форума  
 
Непрочитано 24.07.2007, 09:12
#83
Alaspher


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


Цитата:
Сообщение от ShaggyDoc
3. Вся переменная часть - в атрибутах. Никаких многострочных и простых текстов. Количество атрибутов соответствует количеству строк - для наименования стройки - три атрибута и т.д.
Вообще, для этих целей, предполагается использование полей в сочетании с подшивками. К сожалению, реализация этого механизма не слишком удачна и изрядно многодельна, но тем не менее имеет и плюсы. Использование нескольких однострочных атрибутов для заполнения многострочных надписей тоже не блестящее решение, понятно, что вынужденное. Оно приводит например к тому, что редактирование надписи, вне системы её создавшей, становится крайне неудобным. Использование многострочных текстов в виде блоков позволяет решить часть из этих проблем, правда тож не верх изящества.
Alaspher вне форума  
 
Непрочитано 24.07.2007, 11:18
#84
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Alaspher
Вообще, для этих целей, предполагается использование полей в сочетании с подшивками. К сожалению, реализация этого механизма не слишком удачна и изрядно многодельна, но тем не менее имеет и плюсы.
К сожалению, и изрядные минусы. Замечательная вещь подшивки, но пока не доработана. Бум ждать. Но очень уж помаленьку Аутодеск выдавливает усовершенствования. Раз в год по чайной ложке.

Цитата:
Использование нескольких однострочных атрибутов для заполнения многострочных надписей тоже не блестящее решение, понятно, что вынужденное. Оно приводит например к тому, что редактирование надписи, вне системы её создавшей, становится крайне неудобным
Простое диалоговое редактирование атрибутов стандартными средствами разве "крайне неудобно"?. По желанию, для пущего комфорта - можно и специальный диалог.
ShaggyDoc вне форума  
 
Непрочитано 24.07.2007, 11:35
#85
Alaspher


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


Цитата:
Сообщение от ShaggyDoc
Простое диалоговое редактирование атрибутов стандартными средствами разве "крайне неудобно"?. По желанию, для пущего комфорта - можно и специальный диалог.
Пока редактирование ограничивается одной строкой - нормально, а если нет, то - "крайне неудобно". Естественно, что можно решить внешним механизмом, но я говорю о редактировании средствами АвтоКАДа.
Alaspher вне форума  
 
Непрочитано 24.07.2007, 12:01
#86
Олег К.

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


>> ВСЕМ
Спасибо, что откликнулись. Добавлю некоторые пояснения к сложившейся ситуации.
В представленном архиве есть шаблон форматок применяемый сейчас в нашей конторе - там в блоке только линии и неизменяемый текст, все остальное текстом вне блока. Отсюда и сложность обработки. Еще в архиве есть примеры форматок в виде блоков с атрибутами и полями, они могли бы использоваться, но нет, пользователи (..... ,,,, ..) говорят слишком сложно для них, делай как по проще (но мне-то как раз проще блок с атрибутами). Вообще администрирование КАДа не основная моя работа, занимаюсь в свободное время, денег за это ессно не платят и биться головой об стену не собираюсь. Раньше форматы рисовали вообще линиями и текстом, вставка подписей даже в таком варианте не прошла бы. Ладно, это все отступление от темы.
Теперь о сложностях.
Пользователи умудряются смещать тексты в штампе (хоть и в пределах графы, но все же) и даже весь блок форматки. Приходится ориентироваться на листе по точке вставки блока формата. Жаль нельзя заблокировать определенный объект то изменения его координат.
В графе «фамилия» пишется только фамилия без инициалов, иногда возможны совпадения. Для правильной вставки подписи в таком случае введена проверка должности.
Мда-а, из “песни” слов не выкинешь. Если изменять прогу под атрибуты (к примеру) – придется перелопачивать всю.
Кстати, прога оказалась не на один раз, можно еще повозиться.

>> Alaspher, ShaggyDoc
Есть у меня именно такая форматка – блок с атрибутами, почему не использую объяснил выше. Показывал юзерам программу рисования формата из РуКАДа – слишком сложно, (… ,,,,,,,,).
Если делать штамп отдельным блоком – стоит ли его включать в блок форматки или оставить отдельно? Еще есть боковой штамп согласования – тоже отдельно? А вообще, не все ли равно где находятся атрибуты: в полном блоке формата, или в отдельном блоке штампа? В данном случае дин.блоки не рассматриваются.
Понял, что штампы с полями не подходят – в одном файле могут находиться листы, которые делали разные люди (поэтажные планы или схемы сетей).

>> Кулик Алексей aka kpblc
Программу пока не тестировал. Как я понял для правильной работы нужен список lst (и ежу понятно), фамилия является атрибутом – не подходит под исходную постановку вопроса, но возможно сработает для варианта ShaggyDocа.
Берется точка вставки этого атрибута, далее смещение на 20 единиц. Получается точки вставки атрибута и блока подписи должны находиться в пересечении левой и нижней линий штампа (соответствующих).
Переделывать ничего не прошу, основа есть – сам додумаю.
Олег К. вне форума  
 
Непрочитано 24.07.2007, 12:14
#87
Олег К.

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


полный оффтоп
Цитата:
Сообщение от Alaspher
... В конце концов, может лучше написать чтонибудь совсем другое, что ещё не автоматизировано.
Давно уже продумываю прогу перевода плана сетей в аксонометрию (не трехмерка). Отличая: задается любой угол, не только 45, окружности превращаются в эллипсы. Два варианта: для планов и для стояков. Такая автоматизация нужна?

>> ShaggyDoc
Скорее всего вопрос не к Вам, но когда наконец заработает форум РуКАДа?
Олег К. вне форума  
 
Непрочитано 24.07.2007, 13:50
#88
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Олег К.
Есть у меня именно такая форматка – блок с атрибутами, почему не использую объяснил выше. Показывал юзерам программу рисования формата из РуКАДа – слишком сложно, (… ,,,,,,,,).
Этот мастер применяют редко, так как он универсален. Да, "сложно" несколько кнопок нажать. А потом просто дублируют лэйоуты. Там ведь штампы из обычных блоков и не меет значения, как они созданы. Атрибуты редактируют обычным диалогом.

Цитата:
Если делать штамп отдельным блоком – стоит ли его включать в блок форматки или оставить отдельно? Еще есть боковой штамп согласования – тоже отдельно? А вообще, не все ли равно где находятся атрибуты: в полном блоке формата, или в отдельном блоке штампа? В данном случае дин.блоки не рассматриваются.
Блоков форматок надо много - особенно когда применяются длинные чертежи. Да еще и виды штампов. У нас рамки форматки рисуются, блоками основная надпись и согласования. Для универсальности сделан мастер формата. Кому-то проще наделать форматок. Динамические блоки - для ручной работы, без программирования.


Цитата:
Давно уже продумываю прогу перевода плана сетей в аксонометрию (не трехмерка). Отличая: задается любой угол, не только 45, окружности превращаются в эллипсы. Два варианта: для планов и для стояков. Такая автоматизация нужна?
На мой взгляд - дохлый номер. И какие окружности? Схемы-то все в сантехнике. Не перевести план в аксонометрию - там слишком много условностей.

Варианты реальные -

а) рисование плоской аксонометрии "как на ватмане". Отработано давно. То есть проводим линии сами под нужным углом и вставляем в нужное место нужные УГО.

б) рисование однолинейной схемы в 3D по реальным трассам с последующим построением плоской проекции под 45. Программы преобразования есть. Но тут очень много нюансов, в результате которых после "автоматического" проецирования ручной работы еще больше будет. А в некоторых случаях можно.

http://cad.kurganobl.ru/253.html

Цитата:
>> ShaggyDoc
Скорее всего вопрос не к Вам, но когда наконец заработает форум РуКАДа?
Ко мне вопрос. А форум работает, только в закрытой сети. Пользуясь скрытостью там такого намолотили, просто филиал башорга. Сейчас вот ruCAD-5D обсасываем (3D уже схлынуло).

Вот схожу в отпуск ("брошу пить, возьмусь за вас" (С)) , весь этот треп убью вместе с некоторыми активистками, и открою настоящий форум заново.
ShaggyDoc вне форума  
 
Непрочитано 24.07.2007, 15:33
#89
Олег К.

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


Странно, на почту не приходят сообщения о обновлении темы, только у меня такое?

>> ShaggyDoc
Да я только за, использовать программу рисования форматов. Но приходится работать с теми кто есть, и то встречаются экземпляры "Я как научился чертить, так и буду. И ваш СТП мне не указ". Свои нервы мне дороже. Согласен, каждую форматку в отдельный блок = много блоков (у меня получилось около 35), зато можно по имени блока узнать формат листа и использовать в программах.

Цитата:
На мой взгляд - дохлый номер. И какие окружности? Схемы-то все в сантехнике. Не перевести план в аксонометрию - там слишком много условностей.
Собственно о сантехнике и речь, точнее отопление и вентиляция. Все материалы по данной теме давно изучил, потому и пишу свое. Как разберусь с текущим авралом, подниму отдельную тему.
Система РуКАД (RC2+SP4) давно используется ОВшниками - довольны. Вот только при работе компа под профилем юзера с ограниченными правами возникают ошибки. С аксонометрией в частности.

По форуму РуКАДа - давно пора, не Вам же одному на все вопросы отвечать. Активисток не бейте, их мало осталось .
Совсем обнаглею и спрошу: как стать "доверенным пользователем" системы РуКАД-3D, или хотябы тестером?
Олег К. вне форума  
 
Непрочитано 24.07.2007, 16:45
#90
Zouss


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


2 Олег К.
так какие проблемы - заставить программу, которая рисует форматку, рисовать её в виде блока с добавлением соответствующих атрибутов (имя формата там путь к файлу...)
а по аксонометрии здесь я выкладывал примитивнейшую программку для облегчения процесса, но так как со стороны интерес угас доводить её до ума не стал
Zouss вне форума  
 
Автор темы   Непрочитано 24.07.2007, 17:11
#91
dextron3

проектировшик
 
Регистрация: 01.01.2007
СССР
Сообщений: 5,143


Цитата:
Давно уже продумываю прогу перевода плана сетей в аксонометрию (не трехмерка). Отличая: задается любой угол, не только 45, окружности превращаются в эллипсы. Два варианта: для планов и для стояков. Такая автоматизация нужна?
конечно нужна!!!
__________________
инженер проектировшик с опттом программа авто гад образование высшие
dextron3 вне форума  
 
Непрочитано 25.07.2007, 07:37
#92
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Олег К.
Система РуКАД (RC2+SP4) давно используется ОВшниками - довольны. Вот только при работе компа под профилем юзера с ограниченными правами возникают ошибки. С аксонометрией в частности.
А вот здесь бы подробнее (можно в отдельной ветке). Система построена так, чтобы все действия были доступны обычному пользователю - так, как по умолчанию. Такой пользователь (программы, им запущенные) может писать в HKCU реестра и в пользовательские каталоги. А что такое "юзер с ограниченными правами"? Еще что-то ограничено? Так этого делать нельзя.

Аксонометрия (там, где спрашивается выбор объектов, начало псевдокоординат и рисуется аксонометрия) вообще ничего никуда не пишет. Разумеется, могут быть какие-то ошибки, но никак они не могут быть связаны с правами пользователя. Это чистая арифметика, а программа очень простая.

Цитата:
Совсем обнаглею и спрошу: как стать "доверенным пользователем" системы РуКАД-3D, или хотябы тестером?
Придется подождать. Сейчас эта версия в полуотлаженном состояний в связи с переходами на 2008, да еще и 5D добавляется одновременно, и спецификации. И есть физическое ограничение - мне установили лимит на исходящий трафик. А 3D-версия - это уже несколько Гб.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен лисп (пронизыватель лайаутов)

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

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