Установление прозрачности примитивам

Автор Тема: Установление прозрачности примитивам  (Прочитано 7926 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Доброго всем и с наступившим.
Понадобилось мне тут поиграться с прозрачностью примитивов (пока растры и маски не рассматриваю). В принципе задача, казалось бы, не должна вызывать проблем: через свойство EntityTransparetion устанавливать нужное значение - и все. Но при попытке установить прозрачность ПоСлою или ПоБлоку требуется указывать свойство с учетом локализации AutoCAD.
Т.е. для английской версии сработает только
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-put-entitytransparency ent "ByLayer")
  2. (vla-put-entitytransparency ent "ByBlock")
А для русской версии соответственно
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-put-entitytransparency ent "ПоСлою")
  2. (vla-put-entitytransparency ent "ПоБлоку")
Понятно, что можно попытаться изменить соответствующим образом 440-ю DXF группу, но для прозрачности "ByLayer" она отсутствует, а код вида
Код - Auto/Visual Lisp [Выбрать]
  1. (entmod (vl-remove-if (function (lambda (x) (= (car x) 440)))
  2.                       (entget (vlax-vla-object->ename ent))
  3.                       ) ;_ end of vl-remove-if
  4.         ) ;_ end of entmod
срабатывать отказывается. Эксперименты проводил в AutoCAD 2014 x64 + SP1.
Собственно вопрос - как можно установить прозрачность "ByLayer", забывая про локализацию AutoCAD?
Похоже, продолжительные каникулы все-таки разжижают мозги :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Для BYLAYER: группа 440 отсутствует
Для BYBLOCK: группа 440 равна 16777216
Как-то так у меня получилось.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Да, это я понял. Мне не удается для примитива, у которого была установлена прозрачность (к примеру, "5"), установить прозрачность "ПоСлою" - т.е. убрать 440-ю группу. Через ActiveX это делается на ура, но хочется забыть про локализацию :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Отмечено как Решение Алексей Кулик 07-01-2015, 14:43:51

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А я попробовал заменить значение группы 440 на 0 и получил BYLAYER, при этом группа 440 исчезла, т.е. повторный (entget) её не возвращает. Проверял в AutoCAD 2014 SP1 x64 и 2015 SP2 x64
« Последнее редактирование: 06-01-2015, 22:49:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Отлично, спасибо! :) Вот бы в жизни не подумал, что подобное может срабатывать ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Похоже группа 440 убирается при любом недопустимом значении этой группы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Написав тупую программку вида
Код - Auto/Visual Lisp [Выбрать]
  1. (defun tt (/ ent res count)
  2.   (setq ent   (vlax-ename->vla-object (car (entsel)))
  3.         count 0
  4.         ) ;_ end of setq
  5.   (while (< count 91)
  6.     (vla-put-entitytransparency ent count)
  7.     (setq res   (cons (cons count (cdr (assoc 440 (entget (vlax-vla-object->ename ent))))) res)
  8.           count (1+ count)
  9.           ) ;_ end of setq
  10.     ) ;_ end of while
  11.   (append '(("bylayer" . 0) ("byblock" . 16777216))
  12.           (mapcar (function (lambda (x) (cons (itoa (car x)) (cdr x))))
  13.                   (vl-sort res '(lambda (a b) (< (car a) (car b))))
  14.                   ) ;_ end of mapcar
  15.           ) ;_ end of append
  16.   ) ;_ end of defun
я в результате получил список допустимых значений 440-й группы (вдруг кому-то понадобится):
Код - Auto/Visual Lisp [Выбрать]
  1. '(("bylayer" . 0)
  2.   ("byblock" . 16777216)
  3.   ("0" . 33554687)
  4.   ("1" . 33554684)
  5.   ("2" . 33554681)
  6.   ("3" . 33554679)
  7.   ("4" . 33554676)
  8.   ("5" . 33554674)
  9.   ("6" . 33554671)
  10.   ("7" . 33554669)
  11.   ("8" . 33554666)
  12.   ("9" . 33554664)
  13.   ("10" . 33554661)
  14.   ("11" . 33554658)
  15.   ("12" . 33554656)
  16.   ("13" . 33554653)
  17.   ("14" . 33554651)
  18.   ("15" . 33554648)
  19.   ("16" . 33554646)
  20.   ("17" . 33554643)
  21.   ("18" . 33554641)
  22.   ("19" . 33554638)
  23.   ("20" . 33554636)
  24.   ("21" . 33554633)
  25.   ("22" . 33554630)
  26.   ("23" . 33554628)
  27.   ("24" . 33554625)
  28.   ("25" . 33554623)
  29.   ("26" . 33554620)
  30.   ("27" . 33554618)
  31.   ("28" . 33554615)
  32.   ("29" . 33554613)
  33.   ("30" . 33554610)
  34.   ("31" . 33554607)
  35.   ("32" . 33554605)
  36.   ("33" . 33554602)
  37.   ("34" . 33554600)
  38.   ("35" . 33554597)
  39.   ("36" . 33554595)
  40.   ("37" . 33554592)
  41.   ("38" . 33554590)
  42.   ("39" . 33554587)
  43.   ("40" . 33554585)
  44.   ("41" . 33554582)
  45.   ("42" . 33554579)
  46.   ("43" . 33554577)
  47.   ("44" . 33554574)
  48.   ("45" . 33554572)
  49.   ("46" . 33554569)
  50.   ("47" . 33554567)
  51.   ("48" . 33554564)
  52.   ("49" . 33554562)
  53.   ("50" . 33554559)
  54.   ("51" . 33554556)
  55.   ("52" . 33554554)
  56.   ("53" . 33554551)
  57.   ("54" . 33554549)
  58.   ("55" . 33554546)
  59.   ("56" . 33554544)
  60.   ("57" . 33554541)
  61.   ("58" . 33554539)
  62.   ("59" . 33554536)
  63.   ("60" . 33554534)
  64.   ("61" . 33554531)
  65.   ("62" . 33554528)
  66.   ("63" . 33554526)
  67.   ("64" . 33554523)
  68.   ("65" . 33554521)
  69.   ("66" . 33554518)
  70.   ("67" . 33554516)
  71.   ("68" . 33554513)
  72.   ("69" . 33554511)
  73.   ("70" . 33554508)
  74.   ("71" . 33554505)
  75.   ("72" . 33554503)
  76.   ("73" . 33554500)
  77.   ("74" . 33554498)
  78.   ("75" . 33554495)
  79.   ("76" . 33554493)
  80.   ("77" . 33554490)
  81.   ("78" . 33554488)
  82.   ("79" . 33554485)
  83.   ("80" . 33554483)
  84.   ("81" . 33554480)
  85.   ("82" . 33554477)
  86.   ("83" . 33554475)
  87.   ("84" . 33554472)
  88.   ("85" . 33554470)
  89.   ("86" . 33554467)
  90.   ("87" . 33554465)
  91.   ("88" . 33554462)
  92.   ("89" . 33554460)
  93.   ("90" . 33554457)
  94.   )
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!