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

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

LISP. Как восстановить цвета примитивов внешней ссылки?

Ответ
Поиск в этой теме
Непрочитано 05.09.2011, 16:35 #1
LISP. Как восстановить цвета примитивов внешней ссылки?
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,844

Есть задача: для всех объектов всех внешних ссылок поменять принудительно цвет и вес линии. Это достаточно просто и решается "на ура". Но как сделать обратный ход? То есть восстановить исходный вид объектов? Задача усложняется тем, что примитивы далеко не обязательно имеют настройки ByLayer.
Попытки выполнить reload для описания ссылки эффекта не дали, в том числе и с предварительной выгрузкой файла ссылки. В то же время при открытии файла dwg AutoCAD восстанавливает цвета, вот и мне надо сделать аналогичное, но без перезапуска файла. Очень не хочу использовать ObjectDBX и последовательно читать все ссылки - слишком сложно, мне кажется. Нет ли решения попроще?
Спасибо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 2823
 
Непрочитано 05.09.2011, 16:58
#2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Кулик Алексей aka kpblc, в порядке бреда. Я так понял изменение цвета и веса линий и их последующее восстановление делается в течении одного сеанса работы с чертежом, потому как если нет, то как Ты сам сказал, после открытия все и так восстанавливается. К тому же, изменение Ты делаешь "на ура" программно, значит можно перед изменениями поставить (vla-startundomark actdoc) и после поставить (vla-endundomark actdoc), ну а потом откатить все изменения тем самым восстановив первоначальный вид
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.09.2011, 17:11
#3
Кулик Алексей aka kpblc
Moderator

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


Не получится Сначала меняются настройки примитивов, потом пользователь работает, и только потом ему надо восстанавливать настройки - чтобы можно было оценить, как все выглядит при полноцветной подоснове. То есть "откат" не сработает по определению
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.09.2011, 18:10
#4
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
Это достаточно просто и решается "на ура"
А как именно?
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 05.09.2011, 19:10
#5
VVA

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


Цитата:
Сообщение от Pastor Посмотреть сообщение
А как именно?
Я думаю, что просто перебирая объекты ссылки в таблице описания блоков.

Кулик Алексей aka kpblc, в порядке бреда 2. Цвет и вес примитива все равно меняешь, в этот момент сохрани старые значения или в словаре или в РД примитива. Правда для восстановления потребуется повторный перебор примитивов
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 05.09.2011, 20:35
#6
Кулик Алексей aka kpblc
Moderator

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


Спасибо, завтра попробую.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.09.2011, 01:05
#7
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Как можно поменять что-то в чужом чертеже? Даже если он используется как внешная ссылка. Это в корне неверная работа. Надо сделать копию с файла, и уже в нем менять. Оригинал всегда поможет восстановить если надо утерянное. Тема интересна разве что в техническом плане-если такое случайно произошло, то как вернуть. А в организационном плане следует изменить сущест. порядок. Вернее, беспорядок
Vova вне форума  
 
Автор темы   Непрочитано 06.09.2011, 01:35
#8
Кулик Алексей aka kpblc
Moderator

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


Vova, а кто сказал, что я меняю исходный чертеж?
Код:
[Выделить все]
 (vl-load-com)

(defun _dwgru-conv-xref-ent-to-color (color / adoc layer xref)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for item (vla-get-layers adoc)
    (setq layer (cons (list item
                            (mapcar
                              (function
                                (lambda (x / res)
                                  (setq res (vlax-get-property item (car x)))
                                  (vl-catch-all-apply
                                    (function
                                      (lambda ()
                                        (vlax-put-property item (car x) (cdr x))
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    ) ;_ end of vl-catch-all-apply
                                  (cons (car x) res)
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              (list (cons "lock" :vlax-false) (cons "freeze" :vlax-false))
                              ) ;_ end of mapcar
                            ) ;_ end of list
                      layer
                      ) ;_ end of cons
          ) ;_ end of setq
    ) ;_ end of vlax-for
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (or (not (vlax-property-available-p blk_def 'isxref))
            (equal (vla-get-isxref blk_def) :vlax-true)
            ) ;_ end of or
      (vlax-for ent blk_def
        (if (and (= (vla-get-objectname ent) acdbblockreference)
                 (vlax-property-available-p (setq xref (vla-item (vla-get-blocks adoc) (vla-get-name ent))) 'isxref)
                 (equal (vla-get-isxref xref) :vlax-true)
                 ) ;_ end of and
          (vla-put-color ent color)
          ) ;_ end of if
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (vlax-property-available-p blk_def 'isxref)
             (equal (vla-get-isxref blk_def) :vlax-true)
             ) ;_ end of and
      (vlax-for ent blk_def
        (vl-catch-all-apply
          (function
            (lambda ()
              (vla-put-color ent color)
              ) ;_ end of lambda
            ) ;_ end of function
          ) ;_ end of vl-catch-all-apply
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  (foreach item layer
    (foreach prop (cdr item)
      (vl-catch-all-apply
        (function
          (lambda ()
            (vlax-put-property (car item) (car prop) (cdr prop))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of foreach
  (vla-regen adoc acallviewports)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Пример вызова: (_dwgru-conv-xref-ent-to-color 3)
Вставляемая внешняя ссылка меняет свой вид только в текущем файле, ее состав не затрагивается. Можешь проверить.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.09.2011, 09:46
#9
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Удалить, открепить, снова вставить?прошу прощения если неправильно понял.
Oliver_88 вне форума  
 
Автор темы   Непрочитано 06.09.2011, 10:03
#10
Кулик Алексей aka kpblc
Moderator

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


Внешняя ссылка может быть вставлена в несколько мест. Я пробовал выполнить для нее Unload, но эффект - нуль
P.S. Навалилось другой работы, так что проверить предложение VVA пока не получается
P.P.S. Подумал, что такое тоже вариант, но сопряжено с приличным количеством времени на регенерацию. Попробую, может, что адекватное и получится
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.09.2011, 10:13
1 | #11
VVA

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


Кулик Алексей aka kpblc, Насколько важно полностью поменять цвет внешней ссылки? Это я к тому, что твой код не учитывает:
1. mtext - может иметь форматирование цвета \C
2. перебирая примитивы внешней ссылки, ты наткнешня на блок, но пропустишь его атрибуты
3. в размерах цвет задается еще vla-put-ExtensionLineColor vla-put-TextColor vla-put-DimensionLineColor
4. Leader - vla-put-LeaderLineColor
5. Цвет мультилиний может задаваться в стиле и т.п.
Я этой темой начал заниматся здесь: Lisp colour change for all layers and blocks
Последний вариант перешел в BGTOOLS
Цитата:
BGCOLORXREF - Меняет цвет выбранных внешних ссылок (только в текушем сеансе)
Можешь посмотреть там ф-цию ChangeXrefAllObjectsColor. На данный момент там учтены все "сюрпризы" Автокада в части цвета.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 06.09.2011, 10:23
#12
Кулик Алексей aka kpblc
Moderator

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


Спасибо, обязательно возьму.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.09.2011, 18:24
#13
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc
Я пробовал выполнить для нее Unload, но эффект - нуль
Я имел ввиду Detach.
Oliver_88 вне форума  
 
Автор темы   Непрочитано 07.09.2011, 00:08
#14
Кулик Алексей aka kpblc
Moderator

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


Я не уверен, но у меня ощущение, что придется восстанавливать все вхождения ссылки, с указанием углов поворота, нормалей, слоев, цветов и прочей требухи.
P.S. Прошу паузы, раньше пятницы никак не получается сесть за решение Как только что-то будет более-менее внятное, обязательно отпишусь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как восстановить цвета примитивов внешней ссылки?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Полное скрытие внешней ссылки в пространстве модели с одновременным отображением ее в пространстве листа qwer AutoCAD 20 01.07.2012 09:30
LISP / AutoCAD2008 / Как программно снять выделение у примитивов, не используя sssetfirst TararykovDG LISP 7 14.01.2011 10:48
LISP для поиска групп (наборов) одинаковых примитивов и замена их блоком ElectroBOG LISP 20 23.07.2010 16:00
2008. Глюк с назначением текущего цвета из Lisp? _Andre_ LISP 5 25.10.2007 13:50