Supermax
12.10.2007, 20:26
Модель "усохла" до 3 мегов!
Supermax
13.10.2007, 16:38
Вставил внешнюю ссылку в динамический блок и попробовал на ней все инструменты. Ведет себя также как солид, регион и другие не растягиваемые, но передвигаемые и увеличиваемые объекты. При выгрузке ссылки исчезает, что дает возможность вставлять в виртуальные детали служебную информацию большого объема. Чтобы при работе с моделью содержимое блоков не мешало с ней работать, его, то есть содержимое, можно выгружать. Например, когда изделием является сложная конструкция и к ней прилагается много литературы.
Сие извращение может и не нужно вовсе, но пусть будет.
Supermax
13.10.2007, 18:33
Бедная моя голова! У меня опять идеи поперли. Когда же это кончится?!!!
Короче: Есть динамический блок, свойства - доступны. Замечательно! А динамический блок внутри другого блока, или внешней ссылки? Свойства - тю-тю!
Как сделать так, чтобы можно было менять свойства динамическому блоку находящемуся во внешней ссылке или другом блоке?
Про ссылку, я понимаю, что ее надо с начала Reload, затем поменять свойства в ней и перезагрузить, но надо эти свойства транслировать в основной рабочий файл, чтобы их было видно, и чтобы ими можно было управлять. Теоретически - реализуемо.
В блоке с одной стороны проще, поскольку он и так загружен, а с другой стороны - не знаю, надо пробовать.
Что это дает? - Во первых перемещение по всем трем осям через свойства. Работа динамическими блоками, вставленными во внешние ссылки - тоже весьма необходимо. Да так можно сделать динамический блок на сложный материал с раскрывающимися свойствами подматериалов - круто!
В одном блоке скажем арматурная сетка, а в другом, куда этот блок вставлен как исходник - количество сеток. Вот и каркасик получился. Ну и просто констатацией факта наличия условного материала (значок) уже вполне достаточно.
Я слышал, или точнее читал, что кто-то внутрь блока лезть хотел и там что-то считать намеревался? Вот с начала надо сделать свойства блоков вставленных в другие блоки доступными. Про ссылки вообще молчу - и так ясно, что надо.
Я когда занимался синхронизацией имени блока синхронизировал его даже в третьем вложении ссылок. А синхронизировал его (напоминаю) чтением первого свойства и записью этому свойству его же значения. Это говорит, что чтение и изменение значения свойств возможно при любом уровне вложенности.
Только вот я это делал не с файлом, а с уже загруженной информацией с этого файла. То есть можно менять свойства не редактируя содержимое файла, а при перезагрузке все вернется как и было.
Надо синхронизировать имена и менять свойства динамических блоков в файлах, с последующей перезагрузкой этих ссылок.
Ну я думаю, меня все поняли?
Supermax
13.10.2007, 20:54
Kpblc, это твое?
Supermax
16.10.2007, 11:44
Пользуюсь лиспом Петра В. Лоскутова, который удаляет дубликаты блоков, а у меня таже лажа, только с солидами, да и сдругими примитивами тоже по идее может произойти. Теоретически свойства элемента точь в точь совпавшие с свойствами другого элемента, если сверять абсолютно все, кроме метки, и есть факт наслоения и подлежит коррекции через казнь лишнего.
Еще что мне не понравилось, что работает только по верхам блоков, а в нутрь не лезет. С ссылками не работает (в смыле, тоже в нутрь не лезет). Вт бы кто-нибудь озадачился этим
Код
;;;****************************************************************
;;; PL_bl-del-copy3.LSP
;;;*********************************************************************
;;; ОГРАНИЧЕНИЕ ГАРАНТИЙ
;;; ПРОГРАММА РАСПРОСТРАНЯЕТСЯ НА УСЛОВИЯХ "КАК ЕСТЬ".
;;; АВТОР НЕ БЕРЕТ НА СЕБЯ И НЕ ПОДРАЗУМЕВАЕТ КАКИХ-ЛИБО
;;; ГАРАНТИЙНЫХ ОБЯЗАТЕЛЬСТВ.
;;; ВЫ ИСПОЛЬЗУЕТЕ ПРОГРАММУ НА СВОЙ РИСК.
;;; АВТОР НЕ БЕРЕТ НА СЕБЯ ОТВЕТСТВЕННОСТЬ ЗА ПОТЕРЮ ДАННЫХ,
;;; УЩЕРБ, ПОТЕРЮ ПРИБЫЛИ ИЛИ ЛЮБЫЕ ДРУГИЕ ПОТЕРИ, ПРОИЗОШЕДШИЕ
;;; ВО ВРЕМЯ ИСПОЛЬЗОВАНИЯ ИЛИ НЕПРАВИЛЬНОГО ИСПОЛЬЗОВАНИЯ
;;; ДАННОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.
;;;**********************************************************************
;;; Разрешается использовать, копировать, изменять, и распространять это программное
;;; обеспечение бесплатно для любой цели при условии, что указанные выше знак авторского
;;; права и примечания об ограничениях гарантий будут приводиться во всех копиях.
;;;**********************************************************************
;;; Copyright ©2004 Пётр В. Лоскутов (Alaspher)
;;; e-mail: alaspher@hotmail.com
;;;**********************************************************************
;;;
;;; Утилита для удаления дубликатов блоков с одинаковыми парамертами (точка вставки, слой,
;;; поворот и масштабные коэффициенты). Рекомендуется применение компилированной версии.
;;;
;;; bldelc - удаление дубликатов
;;;
(defun pl:bl-del-copy (/ sela ondel xget)
(setq sela (pl:sel-to-list (ssget "_X" '((0 . "INSERT")))))
(foreach x sela
(if (not (vl-position x ondel))
(setq xget (entget x)
ondel (append ondel
(vl-remove x
(pl:sel-to-list
(ssget "_X"
(list '(0 . "INSERT")
(assoc 2 xget)
(assoc 8 xget)
(assoc 10 xget)
(assoc 41 xget)
(assoc 42 xget)
(assoc 43 xget)
(assoc 50 xget)
(assoc 410 xget)
)
)
)
)
)
)
)
)
(pl:del-force-ent-lst ondel)
)
(defun pl:del-force-ent-lst (lst / lay lget frz lck err k70 key yes)
(setq yes 0
err 0
)
(foreach x lst
(setq lay (tblobjname "layer" (cdr (assoc 8 (entget x))))
lget (entget lay)
k70 (assoc 70 lget)
key (cdr k70)
)
(if (not (zerop (logand key 1)))
(progn (setq frz (cons lay frz)) (entmod (subst (cons 70 (- key 1)) k70 lget)))
)
(if (not (zerop (logand key 4)))
(progn (setq lck (cons lay lck)) (entmod (subst (cons 70 (- key 4)) k70 lget)))
)
(cond ((vl-catch-all-error-p (vl-catch-all-apply (function entdel) (list x)))
(setq err (1+ err))
)
(t (setq yes (1+ yes)))
)
)
(foreach x frz
(setq lget (entget x)
k70 (assoc 70 lget)
)
(entmod (subst (cons 70 (+ (cdr k70) 1)) k70 lget))
)
(foreach x lck
(setq lget (entget x)
k70 (assoc 70 lget)
)
(entmod (subst (cons 70 (+ (cdr k70) 4)) k70 lget))
)
(list yes err)
)
(defun pl:sel-to-list (ss / i ename result)
(setq i -1)
(while (setq ename (ssname ss (setq i (1+ i)))) (setq result (cons ename result)))
)
(defun c:bldelc (/ res)
(setq res (pl:bl-del-copy))
(princ "\nDeleted - ")
(princ (car res))
(princ ", errors - ")
(princ (cadr res))
(princ)
)
(princ "\nCommand line: bldelc")
(princ)
overkill попробуй поковырять. Внутри ссылок лично я ничего сделать "на ура" не смогу. Код слишком длинный получится, а я еще предыдущее задание не добил
Supermax
17.10.2007, 10:21
Стал делать теплообменник фирмы "РоСВЕП-ТРАНТЕР" и обнаружил, что вес изделия дается для двух состояний - полного и пустого. Выглядит строка так: Вес - полного / пустого ___ kg ___ 140/130 Это меня вогнало в раздумья по поводу многообразия названия свойств и адаптации к этому явлению.
Вот мои мысли:
Поделать с эти мы ничего не можем, поэтому надо приспасабливаться. Как? У нас есть два технологических инструмента. Аудит корректности модели и настройка обработки параметров модели. По первой позиции мы проверяем наличие обязательных позиций и проводим обязательные процедуры (типа выравнивания длин). Вторая позиция - мы настраиваем программу приравнивая значения зашитые в программе к значениям существующим в натуре. Программа анализирует свойства блоков выбранных для обработки, дает список всех вариантов названий этих свойств в одном окне и одно из внутрипрограммных названий в окне напротив. Через Shift или Ctrl создаем набор равноценных значений, который закрепляется за конкретным машинным параметром.
Более того, я в xls для этого место определил, куда их можно сохранять.
На странице "Параметры заполнения таблицы", эта страница регламентирует заполнение таблицы по горизонтали, под именами атрибутов-параметров изделия альтернативные значения. В первой строчке пишется то, что должно быть написано в таблице, в смысле заголовок, а ниже это от куда это взято. То есть заголовок подменяет собой заголовки из свойств или атрибутов.
На листе "Очередность сортировки" разбиение таблицы по вертикали. Первая строка название атрибута, все что ниже в этом столбце - его значение. Название атрибута нигде не прописывается, а вот его значения являются заголовками в спецификации. Все значения идут лесенкой, чтобы понятно было, что за чем расположено. Если значения идут сплошным столбцом, это означает, что справа лежащие подразделы относятся к каждому значению из этой группы. Это же правило распостраняется на каждый столбец.
Вся эта логистика уже сделана и отлажена. В результате которой формируется последовательность сбора и расчета материалов. Столбцов можно писать сколько угодно и разбивать по вертикали на любое число групп.
Единственно что меня здесь не устраивает, это то, что на этом листе имена атрибутов не имеют альтернативных значений. А их надо сохранять где-то, поскольку полученная спецификация должна быть укомплектована этим файлом, в котором должен быть сохранен шаблон настройки альтернативных значений.
Красные маркеры - это обязательное условие соответствия номера строки в таблице значению прописанному в маркере.
Так, я придумал где сохранять соответствия имен, не участвующих в заполнении таблицы.
На листе "Параметры заполнения таблицы" с начала идут столбцы таблицы. В той последовательности, в которой они расположены в бланке этой таблицы. Потом мы делаем пустой столбец (а точнее ячейку в строке с именами-параметрами изделий) и дальше заполняем все наши альтернативные значения хоть до судороги в пальцах.
Просто копируем с листа "Очередность сортировки" в лист "Параметры заполнения таблицы" строку с именами атрибутов принадлежности к... начиная с первой пустой ячейки и далее.
Я конечно испытываю твое терпение Kpblc, но в кратце скажу: Любые таблицы имеют градации по вертикали и градации по горизонтали. То есть, значение которое ты хочешь, чтобы попало в бланк в данную точку и было отформатировано по ширине с данными параметрами должно быть сориентировано по X и Y. Y определяется последним значением разделительной черты (со сдвигом в низ естественно) а X прописан в настройке. Ширина форматирования тоже.
Я подошел к проблеме бланкирования пофигистским методом. А пофигу, какой бланк. Шапка, вертикальные разделительные черты заложены в самом бланке, а горизонтальные мы чертим, как только текст закончится. Он ведь и многострочечным может быть. Все эти трюки я уже отработал в самом начале, когда голову над заполнением ломал. Если ты настроил данную таблицу сортировки на шаблон бланка пусть и DWT или макрос лиспа, что ее отчерчивает. то и пределы тебе известны значит. Вставил и прога клепает тебе эти Layout-ы пока есть что клепать. Сохранл спецификацию и xls к ней приложи, чтобы если вдруг чего-то изменится не корячиться.
Supermax
17.10.2007, 13:02
Теплообменник GL-13M. Кушайте на здоровье!
Supermax
17.10.2007, 20:02
Надыбал еще одну интересную задачку.
У блока есть точка вставки, но если объект 3D она вставляться куда хочешь не хочет. Приходится двигать графику в редакторе навстречу к своей судьбе. Но если у вас уже собрана монтажка из 3D блоков, в которых точку вставки не делали (черте где находится), то передвижение графики в редакторе вызывает расползание элементов по всему пространству во всех трех осях. Блоки ведь и повернутые есть. У меня такое произошло с болтами и гайками. Я их вставил в блок когда-то и наплевал на точку вставки. Потом копировал из файла в файл вместе с изделиями, а тут понадобилась эта точка на болте и тю-тю.
В простанстве редактора элемент расположен определеным образом к осям пространства редактора. Если мы перемещаем графику в нутри блока, то этот блок перемещается в модели в направлении, которое привязано к геометрии блока, а не к осям модели.
Короче двумя словами: Я хочу не графику к точке перемещать, а точку вставки к графике. Чтобы в модели не графика расползалась, а точки вставки сползались. Чтобы в блоке перемещение всей графики не отражалось на перемещении в моделе.
В обще задачка не простая. Может решал кто-нибудь?
Продолжу:
Мы знаем куда переместится графика - это точка вставки блока в настоящий момент. Координаты этой точки в 10 коде. Для каждого блока точку "от куда" мы знаем. Теперь надо вычислить точку на графике в настоящий момент. Ну допустим, я влез в блок и поставил обычную точку туда, куда хочу поставить точку вставки. Как из модели определить координаты этой точки по отношению к пространству модели автоматически, а не через nentsel?
Замена "перезаписи" внешней ссылки, код не тестировал
http://forum.abok.ru/index.php?act=attach&...st&id=10547Насчет последней задачи: недавно аналогичную пытались решить на autocad.ru, но "просто так" не получилось. Я тоже пока пас - даже представить себе примерно задачку не могу.
---
Добавлено:
Не все так просто. 10-я точка в XREF'ах - я не помню, как она хранится - в WCS или OCS (210-ю группу не отменяли пока). Соответственно надо переделывать на vla-вариант, там-то только мировые координаты. Но возникает вопрос с преобразованием координат, масштабированием, поворотом...
Supermax
18.10.2007, 11:46
Только что пришел, сейчас буду твою прогу гонять.
А пока - вот как я решил эту задачу по переписыванию точек вставки (вчера прямо перед подъездом своего дома).
Условия: Куча копий блока в разных местах и с разными углами поворота. Точки вставки светятся как звезды на небе, но не на самих блоках.
Надо: Чтобы точки вставки были на графике, но чтобы графика осталась на месте.
Решения: Их два. Первое попроще, но ручное, второе посложнее и для макроса.
Первое решение:
1. Переименовываем блок. Делаем ему имя "Технический" (к примеру). Все блоки теперь - "Технический". И обязательно purge - удаляем из таблицы блок с первоначальным именем. (хотя там их не должно быть)
2. Копируем в буфер любую из копий и открываем второй чистый файл (теперь открыто два файла первый - с моделью и второй чистый)
3. Вставляем из буфера в чистый файл блок.
4. Возвращаем ему его первоначальное имя.
5. Открываем его редактором и наводим порядок с положением точки вставки
6. Выходим из редактора и копируем отремонтированный блок в буфер
7. Возвращаемся в файл с моделью.
8. Открываем редактором блок "Технический"
9. Вставляем из буфера на место графики блок с первоначальным именем и правильной точкой вставки. Я с начала линию подвожу к месту куда точка вставки должна стать, затем убиваю графику и вставляю из буфера блок. Он сволочь, вставляется не туда, куда я показываю, а в 0,0 и приходится его перетаскивать к линии. После чего сношу линию. Если рядом с графикой атрибуты есть - снести.
10. Выходим из редактора, включаем ручки у всех копий блока "Технический" (ну макросом естественно) и взрываем.
После взрыва блока, его начинка остается на своем месте а она является блоком с первоначальным именем.
Если сравнить порядок расположения вхождений блока "Технический" и порядок вновь появившегося блока, то они по идее совпадут. не проверял. А это значит, что перед всеми этими манипуляциями можно сохранить значения динамических свойств, а потом эти значения прописать новичкам.
Второй вариант:
1. Создаем блок "Точка" с точкой внутри на месте точки вставки. Короче все в одной точке.
2. Заходим в редактор блока и ставим эту точку на графику в то место, куда потом станет точка вставки.
3. Выходим из редактора и программно делаем следующее:
3.1. Создаем набор из всех вхождений этого блока
3.2. К каждому элементу набора применяем следующую последовательность действий
3.2.1. Записать метку блока (любые ориентиры на вхождение)
3.2.2. Взорвать блок
3.2.3. Включить через моделспейс ручку у блока "Точка"
3.2.4. Записать ее координаты в моделе и привязать к метке блока
3.2.5. Вернуть Undo-й блок в целостное состояние
4. Открываем редактором блока наш блок и ставим графику на место. В модели все блоки разлетаются кто куда.
5. Программно переносим каждое вхождение блока по координатам привязанным к его метке.
Все. Пригодно даже для динамических блоков, даже если при перемещении графики внутри блока заново переопределяешь привяку к элементам.
Ваши мнения?
Supermax
18.10.2007, 12:46
Протестировал. Теперь, если я указываю существующее имя та ссылка на которую я напал, становится той, чье имя я указал. При этом, если эти манипуляции делать не в том виде, в котором рождены ссылки то вновь обредшие свою индивидуальность воспринимают новое видовое пространство как свое родное и вставляются как в план. Короче с видами пока не работает. И с именами тоже.
С именами старый макрос правильно работает, только спрашивать надо и все.
Во втором варианте именно п.5 (мне так кажется) вызовет 90% проблем. Остальное - не важно в принципе. Не, есть, конечно, вариант такой: предварительно вставить модифицируемый блок в мировой системе координат в точку 0,0,0 с равными масштабами и поворотом = 0; указать новую точку вставки и внутри блока перенести примитивы. Но тут возникает вопрос с переносом вставок блоков. Первую часть перенос примитивов внутри блока) я сделал, осталась вторая. Может, вечером получится...
Supermax
18.10.2007, 17:54
Пункт 5 я проверил. Все работает. Можешь и ты проверить.
Сделай блок с плохой точкой и такой же с хорошей. Хороший выдели цветом. В блоках графика должна быть без поворотов, а только с переносом по X, Y, Z. Расположи хороший блок на графике плохого и так копируй, копируй, копируй. Вращать можешь сколько угодно. Только по дальше друг от друга, чтобы сносы блока видны были, но пары не путались.
Затем Влезь в плохой блок и исправь положение. Плохие блоки расползутся. Теперь бери плохой блок за точку вставки и переноси на точку вставки хорошего (его пара). И можешь это проделать с любыми вариантами поворотов и разворотов.
Если тебе известна точка вставки блока в новом месте (это я с блока "точка" получаю) то в эту координату надо переместить блок данного вхождения. Как бы ты не крутил блок, крутишь ты его вместе с внутриблочным пространством. При перелете в место точки вставки блока графика не будет крутиться, а занчит при перелете обратно блок станет на свое законное место. Ты же переносишь графику в редакторе без ее вращения, так какого ей в модели вращаться?
Supermax
18.10.2007, 18:26
На сколько я понял, ты можешь программно переместить всю гафику в блоке в точку 0,0,0 пространства редактора блоков, точкой, которую ты укажешь на графике блока из пространства модели?
Если так, то тгда создать программно блок с точкой внутри не проблема и вставить его в точку пространства редактора блока - тоже не проблема. Ну так вообще все в шеколаде.
Результат работы макроса будет такой:
Запустили: - Укажите блок:
Указали: - Укажите точку вставки на графике блока:
Тоже указали - все мелькает и вуаля готово.
Полезная штукенция получится. Только перед началом ее работы в макрос надо вставить принудительное сохранение файла, а то если прервется невзначай - трагедия будет.
Вариант "переписки" блока - см. #473,
http://forum.abok.ru/index.php?act=attach&...st&id=10548Обязательно! Блок, на который указываешь, должен быть в мировой системе координат, вставлен с равными масштабами и углом поворота 0. Если этого не сделать, новая точка вставки будет черт-те где. Блоки, вставленные не в мировой системе, тоже ведут себя странно. Разницу по масштабам в разных осях не учитывал вообще. Я догадываюсь, что и где должно быть переделано, но мозгов что-то уже не хватает
Supermax
19.10.2007, 10:45
Kpblc, мое уважение к тебе доходит аж до идолопоклонства. Но ты упрям, как стадо бизонов. Какого черта ты в углы полез? Говорю по русски - не вращаются при перемещении! Деталь повернутая раком-боком перемещается в другю точку, в которой точно так же повернута раком-боком.
Так, я сейчас поем, наберусь сил и разнесу твой макрос на мелкие функции.
Supermax
19.10.2007, 14:13
Для начала про замену ссылок
Kpblc, а почему ты не восстанавливаешь 210 DXF код? В оригинале (210 0.0 0.0 1.0) в преобразованом становится 210 0.0 -1.0 0.0).
Непорядок. После вставки ссылки надо восстанавливать все коды!
Supermax
19.10.2007, 15:01
Я пользуюсь 440, но и в 461 тоже нет. Я вручную поменял ссылке этот код на старый и она стала на свое место. Ты в начале спиши его со старой ссылки, а когда новую поставишь - замени.
Supermax
19.10.2007, 15:31
Kpblc, напиши словами алгоритм работы своего макроса, как я описал тебе свое видение. Типа проверяем то-то лезем туда-то, ищем то-то и т.д. Он у тебя не такой уж и большой.
Описываю код из #467.
Сначала запрашивается вхождение блока и его новая базовая точка;
Разблокируются и размораживаются слои файла (все, поскольку неизвестно, где и как лежит блок);
Вычисляется имя блока, его базовая точка, точка вставки вхождения;
Вычисляется расстояние от будущей базовой точки до точки вставки вхождения и угол поворота блока (*)
в цикле выполняется перемещение блоков - чтобы их новые точки вставки совпадали с будущими (_kpblc-block-reinsert); (*)
В цикле все примитивы блока перемещаются к новой базовой точке
В цикле выполняется обновление всех вхождений блоков;
Восстанавливается состояние слоев.
---
Проблема в местах, отмеченных "*" - там логика хромает.
---
P.S. > #471 : восстановление нормали вставки выполняется, и это там вбито изначально.
P.P.S. Туда же: скорее всего, просто нормали друг на друга накладываются. Блин, неужели придется извращаться? Ох как не хотелось... Я попробую в любом из вариантов #440 / #461 в самом конце удалить слово "normal" и посмотрю, что получится. Если идея окажется верной, выложу код.
Supermax
19.10.2007, 17:28
Ну, все по порядку.
Цитата
Сначала запрашивается вхождение блока и его новая базовая точка;
Что значит "новая"? В смысле просят указать где она должна быть на графике блока?
Старая светится синей звездой в космосе.
Цитата
Вычисляется имя блока, его базовая точка, точка вставки вхождения;
Если я правильно понял, "базовая точка" - это такая фенька с крестиком в пространстве редактора блока, которая по умолчанию стоит в 0,0,0 (из за чего весь этот сыр-бор), но может стоять и не там (вот только по Z она не перемещается). И ты хочешь перенести графику выбранным местом (новая базовая точка) в пространстве редактора блоков (ну это я образно) в эту точку? То есть открыв редактором блок мы увидим, что графика переместилась в точку с кружечком и крестиком и это может быть не 0?
Так, а зачем тебе вычислять расстояние? и к томуже угол? Координат пространства модели, что не достаточно? Или перенос блока из точки А (где раньше горела звезда, а теперь оказался наш блок) в точку Б (где мы ткнули в место на графике) требует каких-то вычислений?
Значит так:
1. Бери и рисуй просто линию и на конце стрелку. (не далеко от нуля, но не на нулях)
2. Делай из нее блок и точку вставки не указывай. При выделении блока звезда засветится в 0,0,0 модели.
3. Обведи линию другой линией (стрелку тоже). Получится две наложенные линии, одна блок, другая - простая.
4. Выдели оба объекта и перенеси куда-нибудь и там поверни в разных осях на любой тебя интересующий градус.
5. Зайди в редактор блока и перенеси линию за кончик стрелки в 0,0,0
6. Выйди и посмотри что получилось.
Чтобы тебе вернуть блок на место надо только взять его за кончик стрелки, где теперь горит звезда и перенести в точку, где находится стрелка простая точно в ее кончик и графика сольется как одно целое. Никаких расстояний и углов вычислять, повторяю, НЕ НАДО!
А вот дальше - уже принципиально. Я (по малознанию своему) взрываю блок, смотрю в моделспейс, где автоматом появляется блок "точка" (все остальные внутри блоков и только один взорван). Слизываю ее координаты и возвращаю процесс назад к целостности блока. Можно и на блоке списать координаты точки, только вот на каждый блок тыкать прийдется, а так взорвал-слизал-восстановил и так к каждому вхождению. Где горит сейчас звезда вообще нет дела. Даже записывать не надо. Горит где-то и блок туда улетел - ну и фиг с ним. А вот вернуть его надо в данную точку, поскольку если внутри блока графику поставить чтобы совпали блок "точка" с точкой вставки, звезда гореть будет точно на месте блока "точка".
Ну в общем я уже по кругу пошел.
А со слоями все правильно, хотя если все время их размораживать и корежить, а потом замораживать, так зачем вообще тогда это придумали?
Восстановление нормали не выполняется. это факт! А вот почему это не выполняется - ковыряйся.
Supermax
19.10.2007, 18:45
Я скачал файлы и разницы с тем, что в теме не узрел. А она есть?
Supermax
19.10.2007, 18:55
Самое прикольное, что если блок делать по человечески, с указанием точки вставки, то точка вставки все равно в пространстве редактора в 0,0,0 а графика становится выбранным местом в 0,0,0. Вот когда туда входишь и ставишь точку вставки принудительно не в 0,0 Z- ведь нет, только тогда она смещается с нуля. В смысле точка.
Еще более интересно, что если графика 2D и в плоскости 0 по Z (ось то есть, это перемещаться по ней не дают), то указав точку вставки в новом месте она и появляется на графике в этом месте, а графика не двигается. Мы ж ее в блоке не двигали. Вся каша, из за того, что в модели мы по Z работаем.
Supermax
19.10.2007, 20:09
210 код и при переносе точки вставки корежится. А должен по идее оставаться не изменным.
> #475 : Разницы и быть не должно. Коды из темы сношу.
> #474 : Завтра вечером (сегодня, увы, никак) сделаю видео, покажу, на чем и как я тестировал.
Supermax
20.10.2007, 12:00
Kpblc, что ты всем советуешь эффективное имя использовать? Они же динамические, то есть все разные в теории. А эффективное имя дает возможность прописать параметр сразу всем блокам. А это надо? Какого они тогда динамическими блоками пользуются?
Эту публику надо скучковать в одном месте. Все, что связано с динамическими блоками надо объеденить. Только тема боюсь опять станет в километр длинной и ее перестанут читать с нуля. А это означает, что детские вопросы будут продолжаться до бесконечности.
Предлагаю писать руководство по работе с динамическими блоками. Один пишет, а все просят и обсуждают каждый параграф этой библии. Библия лежит в теме и ее все качают и обсуждают, и предлагают. Типа протокола общего совещания.
Ты как, поддерживаешь идею? Ты ж модератор.
Даже можно чтобы несколько человек одновременно писали по разному. Типа Евангеле от Supermax-a, от Kpblc-a и т.д. Кому что нравится - то и читает.
Я так понимаю, что это одно из последствий сидения сразу на 2 форумах - dwg.ru и abok.ru

То, что я модер - только уменьшает количество свободного времени, ну и ответственности добавляет. По поводу "переписки" блока вариант, предложенный Евгением на
http://dwg.ru/f/showthread.php?p=176250 , мне не нравится - хотя бы потому, что блок может быть динамическим, и при его подходе вся динамика потеряется напрочь. Мысля мелькнула, как обойти вариант (для начала) неравных масштабов, но это - вечером. Наверное, без видео придется какое-то время побыть
Supermax
21.10.2007, 14:53
Kpblc, я потерял диск с механиклом деск топом 2004. Где найти? Мне болты нужны позарез.
Блин, а я его с полгода назад выбросил

Насчет "перезаписи блока" - мне дальше-то сидеть и голову ломать, или решения Евгения на dwg.ru хватает?
Supermax
23.10.2007, 10:13
Если ты о последней версии, то я ее еще не тестировал. Сейчас займусь. И я так и не понял, динамические блоки рехтует или как? И как с перемещением графики только по Z? Это принципиально, поскольку тогда не нарушаются привязки динамических инструментов.
Да, я о последней. Я ее тоже не тестил - некогда

Я в преобразованиях координат запутался. Надо звать VVA.
Supermax
25.10.2007, 13:09
Kpblc, вот файл с безимянным блоком. Его редактором не откроешь. Есть два вопроса. Первый - можно ли ему присвоить имя и всетаки открыть редактором? Второй - хочу динамический блок с виртуальным изделием сделать безимянным. КАК?
Это очень хорошая защита от ламеров. Я готов пожертвовать содержимым блока (в смысле вложенных pdf файлов, инструкций и рекламы) Рекламу я просто доп. свойством сделаю типа свойства "Представление" а служебную инфоримацию ссылкой.
Вообще-то, похоже, это объект окна ADT-шного, экспортированный в кад. Ему имя присвоить нельзя (vla-put-name не сработает), но скопировать содержимое в новый блок можно. Примерно так:
Код
(defun test (/ adoc ent ent_def name blk lst)
(vl-load-com)
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(if
(and
(=
(type (setq
ent (vl-catch-all-apply
'(lambda () (car (entsel "\nБезымянный блок <Отмена> : ")))
);_ end of vl-catch-all-apply
);_ end of setq
);_ end of type
'ename
);_ end of =
(= (strcase (cdr (assoc 0 (entget ent)))) "INSERT")
(setq ent (vlax-ename->vla-object ent))
(equal (vla-get-isdynamicblock ent) :vlax-false)
(wcmatch (vla-get-name ent) "`**")
(=
(type (setq
name (vl-catch-all-apply
'(lambda () (getstring t "\nНовое имя блока <Отмена> : "))
);_ end of vl-catch-all-apply
);_ end of setq
);_ end of type
'str
);_ end of =
(/= name "")
);_ end of and
(progn
(setq
ent_def (vla-item (vla-get-blocks adoc) (vla-get-name ent))
blk (vla-add (vla-get-blocks adoc) (vla-get-origin ent_def) name)
lst ((lambda (/ res)
(vlax-for subent ent_def
(setq res (cons subent res))
);_ end of vlax-for
(reverse res)
);_ end of lambda
)
);_ end of setq
(vla-copyobjects
adoc
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbobject (cons 0 (1- (length lst))))
lst
);_ end of vlax-safearray-fill
);_ end of vlax-make-variant
blk
);_ end of vla-copyobjects
);_ end of progn
);_ end of if
);_ end of defun
На предоставленном варианте попытки вставить блок могут вызвать ощущение, что сработало неверно. На самом деле исходный блок вставлен не в мировой системе координат, а состав скопирован полностью.
Дин.блок лично мне сделать анонимным не удалось. Имя поменять ему невозможно; тупое копирование примитивов ничего не дает (динамика сносится моментально).
Supermax
25.10.2007, 17:26
Чем же они тогда отличаются? Ну нет имени, я в каде читал, что можно создавать блоки анонимные. Сейчас буду рыться.
Supermax
25.10.2007, 17:38
Да, это ADT сделано и в кад перекачевало, НО!
Вот у меня 2006 кад. Вот файл с непонятной штукой в нутри. Как редактировать? - а фиг его знает. Но кад, хоть и 2006, понимает что это. Посмотри в свойства и увидишь странный тип элемента.
Если взорвать желитинький, или зелененький объект, появляются блоки с окнами, такой, какой я тебе на опознание дал. Такого не может быть, чтобы в программе небыло подхода к доступу в элемент.
создание описания анонимного блока:
Код
(setq blk_def (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0. 0. 0.)) "*U"))
Насчет "странного" вида объекта. Хотя у меня и ADT2006 установлен, но, запущенный как acad, он распознал объект как proxy-объект. Формат представления proxy-объектов закрыт и доступен только членам ADN (почему Ривилис, входящий в ADN, и написал explodeproxy). ADT2006 вывалил сообщение об объектах более новой версии (кстати, explode не проворачивал - и без него все стало понятно).
Я не стал заморачиваться с ADT 2007 и попробовал открыть в AA2008Rus. Там все нормально открылось - стена 2-слойная, окно прямоугольное 8-створчатое (хотя на самом деле обычное глухое окно, просто профиль ему сделали). Вдобавок стена вставлена черт-те как. Для нормального отображения (как это делается в ADT) поменял нормаль объекта - все стало понятно.
Supermax
26.10.2007, 9:50
А теперь угадай, как я это сделал.
А он что, динамический? Был бы динамический - было бы интересно. Такого-то результата, как у тебя, я тоже добивался, только толку с этого...
Как сделал? Могу только предположить: вставил дин.блок, потом элементы его вхождения скопировал в только что созданный анонимный блок - и удалил исходник. Так?
Supermax
26.10.2007, 10:13
Нет.
Я положил рядом с этим блоком динамический блок с трубой. Растянул его. Посмотрел, какой у него DXF-2 и далее сделал так:
(setq a1 (entget (car (entsel))))
(setq a2 (subst '(2 . "*U3") '(2 . "*U1") a1))
(entmake a2)
С начала я ткнул в блок с окном и переписал все его коды в переменную а1. Затем заменил DXF-2 на ... ну ты видишь. Создал новый элемент. Вместо окна появилась труба. Причем той длинны, которую я вытянул перед перемещением. Если копировать начинку - скопируется базовое значение длинны, а так - афигеть.
Запаришься на файле с хотя бы 3-4 сотнями таких блоков вручную делать. И потом, особого смысла, если честно, я не вижу.
О, вопрос: а что у тебя там помимо блоков еще 51 примитив делает? Видимость, конечно, у них, отключена, но это не мешает им существовать
Supermax
26.10.2007, 10:36
Дык это все заблудилось однако.
Сделал обратный процесс. Списал все DXF реквизиты с динамического блока, а 2-ой код подставил *U1 то есть от окна. При создании появился безимянный блок с окном на месте моего динамического, точкой вставки и положением точь, в точь, как динамический. Вывод - графика из базы берется по 2-му коду и только.
Щас я еще один экспремент сбацаю.
Так включи им видимость, у меня ничего не включается. Может это дин. свойства висят?
Supermax
26.10.2007, 10:55
Взял два нормальных динамических блока. Один - труба, другой - линия. Списал данные с линии, заменил ей 2-ой код на код 2 из трубы и сделал объект. Полученный объект, несмотря на то, что оба родителя имели имена стал безимянным. Сделал ему attsync появились у этого безимянного блока атрибуты. Вот есть теперь у нас безимянный блок с атрибутами, однако.
Supermax
26.10.2007, 11:49
Я знаю, что это за элементы ты видишь. Это в динамическом блоке графика из других представлений лежит. В настоящем дин. блоке в разных окнах лежат: оболочка и торцы другого диаметра, моя реклама (тоже много элементов). Поскольку доступа к этим представлением теперь нет они и не видны и включить их врядли получится. Хотя сам факт наличия в базе блока "левых" деталей может пригодится.
Код
(defun show ()
(vlax-for ent
(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
(vl-catch-all-apply '(lambda () (vla-put-visible ent :vlax-true)))
);_ end of vlax-for
);_ end of defun
Вот и вся любовь. Примитивы открыты (проверял на ADT2006 as acad; ACAD2007)
Supermax
26.10.2007, 12:24
К сожалению ADT на этом компе не имею. А в каде ничего не произошло. Может скажешь что ты видишь?
Supermax
26.10.2007, 13:00
Цитата
Вообще-то, похоже, это объект окна ADT-шного, экспортированный в кад. Ему имя присвоить нельзя (vla-put-name не сработает)
Код
(vla-ConvertToStaticBlock (vlax-ename->vla-object (car (entsel))) "qqq")
и обратно
Код
(vla-ConvertToAnonymousBlock (vlax-ename->vla-object (car (entsel))))
Только вот одна фигня осталась не разрешенная. В блоке как я и предполагал лежит остальная графика, но она выключенная для пространства модели и включенная для пространства редактора блоков. Если в блок зайти и выйти, то спросит сохранить или нет. Если ответить сохранить - графика станет видна и в модели.
Помнишь базар на счет выключения элементов в блоке. Так вот они - выключенные, только как это сделать специально?
Supermax
26.10.2007, 13:11
У Полещука маленькую недочипятку нашел. Он пишет, что vla-ConvertToStaticBlock "конвертация динамического блока в статический с именем" а он и анонимные блоки конвертирует однако.
Разговор насчет "выключения", конечно, помню. Но для дин.блоков надо смотреть словари их описаний, а я там не очень разбирался. vla-converttostaticblock - метод, появившийся только в 2006 версии (где и были дин.блоки запущены). То, что оно анонимные блоки обрабатывает, мало о чем говорит - vla-put-name для описания анонимного блока тоже сработает. Только файл будет испорчен, даже _audit его не всегда поднимет.