Supermax
13.4.2007, 13:06
Во первых, если элемент библиотечный, то в нем есть атрибут с номером в этой библиотеке и при обработке модели прога просто обязанна обратится в библиотеку за сведениями об этом элементе, но если файл перекочевал на компьютер заказчика или фрилансера, или этот файл содержит элементы других библиотек, но также содержит и собственные сведения, то по принципу субординации считается то, что доступно. Если нет доступа к библиотеке, считаем, то что имеем.
При работе с библиотекой, никто ничего не получает, все только берут. Это очень важное отличие.
При вставке одноименных блоков AutoCAD ругается и если пользователь слеп и туп, да еще в придачу засланный шпион, то ... ?? У динамических блоков имя тутже меняется само. Было *U9, при вставке в другой лист стало *U12, при повторной вставке из имени *U5 все равно сделало *U12, поскольку параметры длинны одни и теже. Я как не бился, а имена строго соответствуют набору параметров.
Ты поиграйся с динблоком трубы, поиграйся. Советую. И все твои лавинообразно сыплящиеся страхи, а заодно и намерения по их устранению самоустранятся.
<font size='1' color='#8e8b8b'>Добавлено - 14:09</font>
Если кому-то интересно, то вот мои мысли по поводу маркировки изделий:
Видов продукции очень много. Среди всех видов, той продукции, которая маркируется достаточно много. Единых правил по составлению маркировки не существует. Разве, что штрих-код. Я рассматриваю маркировку цифро-буквенную.
Да, в динамических блоках, методом перекрестных ссылок между свойством блока «Visibility Set» и «Lookup Set» можно создать самоустанавливающуюся позицию маркировки изделия, НО! Этот прием применим только для небольшого количества вариантов маркировки. При количестве более 100, смысла в создании такой громоздкой системы нет. Помимо этого существуют случаи, когда в марку изделия включены такие параметры как длина, высота, объем, площадь, радиус, диаметр и т.п. Эти параметры имеют такое количество вариантов, что создавать дискретную систему их выбора и завязывать средствами динамических блоков просто абсурд.
Что делать? Очевидно, что надо каким-то образом «склеивать» имена и значения, или только значения группы атрибутов друг с другом. Подход, который я с начала предложил через файл-маршрутизатор – не правильный. У разных производителей по разным гостам и зарубежным стандартам совершенно разные случаи бывают. Вот например у Мосфлоулайн, в маркировку шаровых кранов входит такой параметр, как высота штока, а в случае труб к названию надо приклеивать и имя, и значение атрибута «L=» то есть длинна такая-то.
Я не могу навязывать всем производителям свой файл-маршрутизатор. Но создать такой блок, в котором удобно размещена информация о том, что и с чем склеивать – могу. Я всячески оттягиваю тот момент, когда использование расширенных данных станет единственной возможностью, хочу постараться сделать создание блока доступным для всех пользователей, но чует мое сердце, что настал час использования расширенных данных.
С начала о том, «что» склеивать.
1. Значение атрибута «НАИМЕНОВАНИЕ»
- Ну вполне понятно, ч то в колонке спецификации, в которой представлено наименование изделия, то есть значение атрибута «НАИМЕНОВАНИЕ», необходимо дополнить это значение еще несколькими дополнительными характеристиками.
2. Значение атрибута «ТИП_МАРКА_ОБОЗНАЧЕНИЕ»
- Тоже понятно, что марку не всегда просто прочесть, ее иногда надо и создать. В таком случае значение атрибута «ТИП_МАРКА_ОБОЗНАЧЕНИЕ» является только первым элементом марки, а все последующие берутся только из значений (без имен) других атрибутов.
Больше вариантов (в нашем варианте спецификации) я не вижу.
Теперь о том, «с чем» склеивать.
1. Все параметры длин, радиусов и пр. линейных значений динамических атрибутов.
2. Некоторые позиции динамических атрибутов дискретного выбора.
Тоже, больше вариантов (в нашем варианте спецификации) я не вижу.
Теперь о том, «как» склеивать.
- Понятное дело, программой, которая предназначена для обсчета модели.
И я кажется придумал как это делать.
Если в конце значения атрибута с именем «ТИП_МАРКА_ОБОЗНАЧЕНИЕ» или «НАИМЕНОВАНИЕ» стоит многоточие «…» от трех точек и выше, то это означает, что наименование или маркировка не полное и следует к нему добавить то имя атрибута или только его значение, где многоточие стоит перед значением или с него начинается имя.
Например:
«НАИМЕНОВАНИЕ» - Труба ППУ в металлической оболочке
из оцинкованной стали….
«ТИП_МАРКА_ОБОЗНАЧЕНИЕ» - Ст 426х…
«Толщина стенки трубы мм.» - …7
«Тип изоляции» - …-1
«Материал утеплителя» - …-ППУ
«Материал оболочки утеплителя» - …-М
«…. L=» - 11000
После обработки получаем:
«НАИМЕНОВАНИЕ» - Труба ППУ в металлической оболочке
из оцинкованной стали L=11000
«ТИП_МАРКА_ОБОЗНАЧЕНИЕ» - Ст 426х7-1-ППУ-М
Почему спросите длинна приклеилась к имени, а все остальное к маркировке? – все очень просто. У имени четыре точки, и у L= тоже четыре, а у маркировки три.
Последовательность склеивания определяется последовательностью расположения.
Точки совершенно не мешают визуальному восприятию свойств, в отличии от разных знаков, и несут в себе численное значение, позволяющее оперировать различными позициями атрибутов изделия.
Вот файлик с изделиями Мосфлоулайн 1,44 МБ
Supermax
13.4.2007, 13:46
AutoCAD не дает вставлять одноименные динамические блоки. При вставке он заменяет импортируемый объект на собственный. Если из бидлиотеки взят динблок, а затем администратор библиотеки его отредактировал, то вставить его в чертеж можно только если поменять ему имя. Таким образом считаю, что чертеж защищен от "случайных" связей. Предлагаю оригинальное использование оригинального имени - Порядковый номер элемента в базе. Если элемент претерпел изменения, то и номер тоже.
Ух, пофлудю! Будет желание - пост стирайте, мне не жалко

Цитата
Ты поиграйся с динблоком трубы, поиграйся. Советую. И все твои лавинообразно сыплящиеся страхи, а заодно и намерения по их устранению самоустранятся.
А разве только трубы нужны? У меня, например, еще и панели, и плиты, и арматура ОВ, ВК, ЭО на совести болтается, и узловые куски... До хрена всего. Так что труба с моей точки зрения - это один конкретный случай, и не более того.
По поводу расширенных данных. Поскольку ты постепенно подходишь к их использованию, сразу хочу предупредить: РД имеют порядочное количество ограничений. Самые главные из них - это ограниченность размера (16 килобайт), который дербанится между
всеми приложениями. И второе - это ограничение и некоторая "зарезервированность" ключей. Лучше будет использовать ldata.
P.S. Я у себя на блоге наконец-то положил очередную сборку своих лиспов, хочешь - посмотри. Там не все отлажено "на ура", но поглядеть ИМХО можно
Supermax
16.4.2007, 16:14
На последней странице можно что угодно, только народ этого не просек пока. Читать многие умеют, но очень плохо (через слово). Самое главное свои сообщения редактируй вовремя, а то ссылаются на то, чего уже нет. Да и стирай, когда время их пришло+
За предложение спасибо, но я все равно далеко от темы отходить не могу, вот если ты мне скажешь, что там-то и там-то лежит лисп, который в такой-то проблеме мне может помочь, буду благодарен. А то, что толку разбирать тексты, если они не приспособлены для твоих целей? Только время потеряешь. Да, может научишся чему нибудь, но когда в поисковике набираешь ЛИСП, после обвала этих лиспов, что-то ничего разбирать не тянет.
По поводу панелей и прочих деталей, могу дать ценный совет - надо к этому делу привлечь ресурс Интернета. Только с начала надо определиться в каком виде тебе это надо. Я думаешь, что просто так над оформлением объекта чертежа бъюсь? Нет. Я сделаю пару, тройку блоков и на DWG.ru выложу с предложением продолжить серию и обменяться результатами. Если каждый сделает по одному блоку, то получит все, которые сделали другие. Выгодно? - Думаю, что еще как выгодно!
Оффтоп и злостный флуд:
Цитата
На последней странице можно что угодно, только народ этого не просек пока.
Для справки: у меня на одну страницу выводится сейчас 40 постов, и последняя страница начинается с поста kpblc Отправлено: Apr 9 2007, 14:59
А у тебя как?
Цитата
Самое главное свои сообщения редактируй вовремя, а то ссылаются на то, чего уже нет. Да и стирай, когда время их пришло
Чтобы опять потом нить темы потерялась? Не, я на такое не согласный

Цитата
Я сделаю пару, тройку блоков и на DWG.ru выложу с предложением продолжить серию и обменяться результатами. Если каждый сделает по одному блоку, то получит все, которые сделали другие. Выгодно? - Думаю, что еще как выгодно!
Ага. Только сколько народу пришлет тебе блоки? Такие предложения возникают с завидной регулярностью, только делиться что-то никто не спешит...
Ну, давай мы с тобой будем вместе одну серию долбать и друг с другом обмениваться, а в теме будем констатировать факт произведенного обмена и обсуждать ощущения от процесса несозидания. Ведь на половину сократится объем. Мне тоже надо и прокат, и ЖБ изделия и многое другое. А кто захочет присоединиться - милости просим. Только за ответный трудовой подвиг.
Да кто-ж говорит про темы "с нитью"? Я о флуде базарю. Да и о корректировке, а то глючное сообщение стерто, а ревирансы по поводу его возникновения остались.
Ну не сказал бы, что флуд ненужен
http://www.forum.abok.ru/index.php?act=ST&...=26&t=17508 - и, елси не трудно, обоснуй свой голос. Я проголосовал против, т.к. не считаю это правильным.
Теперь по теме. Видишь ли, я
не спец в ОВ, я - программер. Не больше, но и не меньше.
Цитата
одну серию долбать
Да я бы рад, если б хоть что-то понимал в этом деле. ЖБИ, например, я вообще делал без библиотеки блоков, отрисовывая их динамически, с одновременной проверкой актуальности данных - они слишком легко алгоритмизировались, чтобы я прошел мимо такой возможности (правда, у меня на работе почти не встречаются непрямоугольные плиты и панели, так что мне было легче). Прокат можно брать у Геннадия Поспелова
на сайте - у него там вроде даже отдельно это вынесено было.
Supermax
17.4.2007, 14:11
Тудыть твою медь! Флуд, или треп, или болтовня естественно нужны, но только для поддержания настроения в текущем моменте. А для всей темы в целом - серьезнейшая помеха читаемости основного материала. Что основное, а что не основное не так уж и важно, даже можно некоторые перлы флуда оставлять, как самые флудливые. НО!!! Начиная с первой страницы и до предпоследней надо по максимуму освобождать текст от трепа! А на последней странице (а она у тебя говоришь аж 40 сообщений) можно хоть голую ... показывать. К стати, почему до сих пор нет смайлика "Вид с зади"? С боку есть, с переди есть, а с зади нет! Непорядок! Да и с низу тоже не помешает, типа упал.
По поводу созидательного процесса:
Ты для кого проги пишешь? Для балерин? Или для проектировщиков?
Как можно писать проги, если нет у программиста понимания о форме объекта? А если есть, то самый лучший эталон комплектности объекта, это какой-нибудь готовый объект. Вот давай и создадим, хотя бы один. А если у тебя есть в базе что нибудь подходящее - выставь на обсуждение. Если это не эталон - доделаем. А если эталон - будем по нему равняться.
Не хочешь - найди кого нибудь из проектировщиков у себя в институте и нагрузи.
Я вот как раз этим эталоном и занят, а то не понятно, прогу вроде пишем, а что она считать будет не имеем.
У меня такого проката - как грязи. Да программка удобная, но мне надо 3D c атрибутами. Я после трубы ППУ пару швелеров сделаю.
По пунктам:
Цитата
ы для кого проги пишешь? Для балерин? Или для проектировщиков?
Проги пишу для пользователей (и мне глубоко фиолетово - проектировщики они, уборщицы или балерины). Мне пользователи ставят задачи, я их додумываю и потом делаю. Понадобилось им АР-ные чертежи переводить "в подложку" - да пожалуйста. Сказали, чего надо в конце получить, а остальное моя забота.
Цитата
Как можно писать проги, если нет у программиста понимания о форме объекта?
Можно. Достаточно задачу нормально поставить. Хорошая постановка задачи - не меньше 70% решения. Если тебе надо разработать средство для решения, к примеру, такого:
"Позволить пользователю многократно вставлять блок, находящийся в библиотеке. Блок в момент вставки динамически отрисовывается рядом с курсором. Атрибуты блоков заполняются автоматически, на основании списка возможных. Библиотека блоков лежит локально, кроме текущего пользователя, к ней никто доступа не имеет"
Вот такую задачу я тебе сделаю. Не сразу, еще потерроризирую, но в конце концов сделаю. В этом - моя работа.
Вспомни тему "борьбы с сисадминами". Так вот, я - почти сисадмин. Я обязан сделать так, чтобы пользователю было удобно работать, а чем он будет заниматься - простановкой условных обозначений с помощью моих дополнений или в CS рубиться - меня не волнует. Я не обязан знать до тонкостей все вопросы проектирования и программирования. Иначе на меня можно за компанию повесить и вопросы обмена данными ACAD <-> 1C <-> MS Project <-> PDM, и коридоры подметать.
Supermax
18.4.2007, 18:44
Ну, посмотрим, что скажет на это уважаемая публика.
3D динамический блок теплоизолированной трубы Д-159 с атрибутами.
В блоке автоматически меняются атрибуты в зависимости от быбираемых параметров свойств.
Обратите внимание на маркировку, наименование, вес изделия и пр. параметры. Там, где нет вариантов исполнения, параметры автоматически становятся только для чтения и т. д.
Блок легко переносится, копируется, и уже легко перетягивается за метку привязки. Размер файла при использовании динамических блоков вместо солидов практически не увеличивается.
В целом есть над чем поработать. Например над упрощением создания блока.
Файл 200 кб.
Файл вернулся после реставрации.
Посыпаю голову пеплом, не тот файл положил. Вот правильный.
Supermax
24.4.2007, 14:47
Ребята, я случайно не тот файл положил. У меня была старая версия и новая, в разных папках, вот я и перепутал. Сори огромное.
Файл поменял. ( на предидущей странице) Чтобы сгладить свою оплошность выкладываю лисп от Полищука Н.Н. Надеюсь он меня не заругает.
Раскрытие свойсв динамического блока (к стати этого самого).
; по данным Лазебного А.В., 22.04.07
(vl-load-com)
(setq es (car (entsel)))
(setq ve (vlax-ename->vla-object es))
(vlax-dump-object ve T)
;#<VLA-OBJECT IAcadBlockReference 0e84068c>
; IAcadBlockReference: Интерфейс AutoCAD для работы с вхождениями блоков.
; Значения свойств:
; Application (RO) = #<VLA-OBJECT IAcadApplication 00d73d3c>
; Document (RO) = #<VLA-OBJECT IAcadDocument 014bb7a8>
; EffectiveName (RO) = "Труба ППУ Д-159"
; Handle (RO) = "940"
; HasAttributes (RO) = -1
; HasExtensionDictionary (RO) = -1
; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 111a9304>
; InsertionPoint = (1751.35 1182.81 0.0)
; InsUnits (RO) = "Миллиметры"
; InsUnitsFactor (RO) = 1.0
; IsDynamicBlock (RO) = -1
; Layer = "0"
; Linetype = "ByLayer"
; LinetypeScale = 1.0
; Lineweight = -1
; Material = "ByLayer"
; Name = "*U41"
; Normal = (0.0 0.0 1.0)
; ObjectID (RO) = 2130600192
; ObjectName (RO) = "AcDbBlockReference"
; OwnerID (RO) = 2130644216
; PlotStyleName = "ByLayer"
; Rotation = 0.0
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 11135c60>
; Visible = -1
; XEffectiveScaleFactor = 1.0
; XScaleFactor = 1.0
; YEffectiveScaleFactor = 1.0
; YScaleFactor = 1.0
; ZEffectiveScaleFactor = 1.0
; ZScaleFactor = 1.0
; Поддерживаемые методы:
; ArrayPolar (3)
; ArrayRectangular (6)
; ConvertToAnonymousBlock ()
; ConvertToStaticBlock (1)
; Copy ()
; Delete ()
; Explode ()
; GetAttributes ()
; GetBoundingBox (2)
; GetConstantAttributes ()
; GetDynamicBlockProperties ()
; GetExtensionDictionary ()
; GetXData (3)
; Highlight (1)
; IntersectWith (2)
; Mirror (2)
; Mirror3D (3)
; Move (2)
; ResetBlock ()
; Rotate (2)
; Rotate3D (3)
; ScaleEntity (2)
; SetXData (2)
; TransformBy (1)
; Update ()
; Получаем семейство дианмических свойств
(setq DynPrs (vla-GetDynamicBlockProperties ve))
(setq props (vlax-variant-value DynPrs))
(setq lprs (vlax-safearray->list props))
;(#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4a64>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4644>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4804>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f47e4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f41c4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f46a4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f45a4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4684>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4904>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4844>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 11190164>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1c64>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1c84>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1ca4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1cc4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1ce4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d04>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d24>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d44>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d64>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d84>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1da4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1dc4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1de4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e04>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e24>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e44>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e64>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e84>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1ea4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1f84>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1fa4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1fc4>
;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1fe4>)
; количество свойств
(setq countPrs (length lprs))
; Проверяем первое
(setq pr0 (nth 0 lprs))
(vlax-dump-object pr0)
#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4a64>
; IAcadDynamicBlockReferenceProperty: Интерфейс AutoCAD для свойств динамического блока
; Значения свойств:
; AllowedValues (RO) = ("Ст 159х4,5-1-ППУ-ПЭ" "Ст 159х5-1-ППУ-ПЭ" "Ст 159х5,5-1-ППУ-ПЭ" "Ст 159х6-1-ППУ-ПЭ" "Ст 159х7-1-ППУ-ПЭ" "Ст 159х8-1-ППУ-ПЭ" ... )
; Description (RO) = ""
; PropertyName (RO) = "Visibility"
; ReadOnly (RO) = 0
; Show (RO) = 0
; UnitsType (RO) = 0
; Value = "Ст 159х8-1-ППУ-ПЭ"
; Возможные значения 0-го свойства
(setq AlVals0 (vla-get-AllowedValues pr0))
(setq lVals (vlax-safearray->list (vlax-variant-value AlVals0)))
;(#<variant 8 Ст 159х4,5-1-ППУ-ПЭ> #<variant 8 Ст 159х5-1-ППУ-ПЭ>
;#<variant 8 Ст 159х5,5-1-ППУ-ПЭ> #<variant 8 Ст 159х6-1-ППУ-ПЭ>
;#<variant 8 Ст 159х7-1-ППУ-ПЭ> #<variant 8 Ст 159х8-1-ППУ-ПЭ>
;#<variant 8 Ст 159х4,5-2-ППУ-ПЭ> #<variant 8 Ст 159х5-2-ППУ-ПЭ>
;#<variant 8 Ст 159х5,5-2-ППУ-ПЭ> #<variant 8 Ст 159х6-2-ППУ-ПЭ>
;#<variant 8 Ст 159х7-2-ППУ-ПЭ> #<variant 8 Ст 159х8-2-ППУ-ПЭ>
;#<variant 8 Ст 159х4,5-1-ППУ-М> #<variant 8 Ст 159х5-1-ППУ-М>
;#<variant 8 Ст 159х5,5-1-ППУ-М> #<variant 8 Ст 159х6-1-ППУ-М>
;#<variant 8 Ст 159х7-1-ППУ-М> #<variant 8 Ст 159х8-1-ППУ-М>
;#<variant 8 ООО "Виртуальные Строительные Технологии">)
; Список возможных значений всех свойств дин. блока
(setq all-lVals '() k -1)
(repeat countPrs
(setq k (1+ k) pr-k (nth k lprs))
(setq AlVals-k (vla-get-AllowedValues pr-k))
(setq val-k (vlax-variant-value AlVals-k))
; проверка правильности индексов массива (м.б. пустой массив)
(if (>= (vlax-safearray-get-u-bound val-k 1) (vlax-safearray-get-l-bound val-k 1))
(setq lVals (vlax-safearray->list val-k))
(setq lVals nil)
)
(setq all-lVals (append all-lVals (list lVals)))
)
; Результат
;((#<variant 8 Ст 159х4,5-1-ППУ-ПЭ> #<variant 8 Ст 159х5-1-ППУ-ПЭ>
; #<variant 8 Ст 159х5,5-1-ППУ-ПЭ> #<variant 8 Ст 159х6-1-ППУ-ПЭ>
; #<variant 8 Ст 159х7-1-ППУ-ПЭ> #<variant 8 Ст 159х8-1-ППУ-ПЭ>
; #<variant 8 Ст 159х4,5-2-ППУ-ПЭ> #<variant 8 Ст 159х5-2-ППУ-ПЭ>
; #<variant 8 Ст 159х5,5-2-ППУ-ПЭ> #<variant 8 Ст 159х6-2-ППУ-ПЭ>
; #<variant 8 Ст 159х7-2-ППУ-ПЭ> #<variant 8 Ст 159х8-2-ППУ-ПЭ>
; #<variant 8 Ст 159х4,5-1-ППУ-М> #<variant 8 Ст 159х5-1-ППУ-М>
; #<variant 8 Ст 159х5,5-1-ППУ-М> #<variant 8 Ст 159х6-1-ППУ-М>
; #<variant 8 Ст 159х7-1-ППУ-М> #<variant 8 Ст 159х8-1-ППУ-М>
; #<variant 8 ООО "Виртуальные Строительные Технологии">)
; (#<variant 8 Теплоизолированная стальная труба Д-159 в полиэтиленовой оболочке ...>
; #<variant 8 Теплоизолированная стальная труба Д-159 в оболочке из оцинкованной стали ...>
; #<variant 8 Custom>) (#<variant 8 Ст 159х4,5-1-ППУ-ПЭ> #<variant 8 Ст 159х5-1-ППУ-ПЭ>
; #<variant 8 Ст 159х5,5-1-ППУ-ПЭ> #<variant 8 Ст 159х6-1-ППУ-ПЭ>
; #<variant 8 Ст 159х7-1-ППУ-ПЭ> #<variant 8 Ст 159х8-1-ППУ-ПЭ>
; #<variant 8 Ст 159х4,5-2-ППУ-ПЭ> #<variant 8 Ст 159х5-2-ППУ-ПЭ>
; #<variant 8 Ст 159х5,5-2ППУ-ПЭ> #<variant 8 Ст 159х6-2-ППУ-ПЭ>
; #<variant 8 Ст 159х7-2-ППУ-ПЭ> #<variant 8 Ст 159х8-2-ППУ-ПЭ>
; #<variant 8 Ст 159х4,5-1-ППУ-М> #<variant 8 Ст 159х5-1-ППУ-М>
; #<variant 8 Ст 159х5,5-1-ППУ-М> #<variant 8 Ст 159х6-1-ППУ-М>
; #<variant 8 Ст 159х7-1-ППУ-М> #<variant 8 Ст 159х8-1-ППУ-М> #<variant 8 Custom>)
; (#<variant 8 ОКП 493600; ТУ 400-24 578-92> #<variant 8 Custom>)
; (#<variant 8 ЗАО "Мосфлоулайн"> #<variant 8 Custom>)
; (#<variant 8 4,5мм.> #<variant 8 5мм.> #<variant 8 5,5мм.> #<variant 8 6мм.>
; #<variant 8 7мм.> #<variant 8 8мм.>)
; (#<variant 8 4,5мм.> #<variant 8 5мм.> #<variant 8 5,5мм.> #<variant 8 6мм.>
; #<variant 8 7мм.> #<variant 8 8мм.> #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)>
; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)>
; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)>
; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)>
; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)>
; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)>
; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)>)
; (#<variant 8 4,5мм.> #<variant 8 5мм.> #<variant 8 5,5мм.> #<variant 8 6мм.>
; #<variant 8 7мм.> #<variant 8 8мм.> #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>)
; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>)
; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>)
; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>)
; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>)
; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>)
; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>)
; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)>)
; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 Custom>)
; (#<variant 8 Пенополиуретан> #<variant 8 Custom>)
; (#<variant 8 Шт.> #<variant 8 Custom>)
; (#<variant 8 22.391 (кг.)> #<variant 8 24.231 (кг.)> #<variant 8 26.061 (кг.)>
; #<variant 8 27.881 (кг.)> #<variant 8 31.481 (кг.)> #<variant 8 35.031 (кг.)>
; #<variant 8 24.122 (кг.)> #<variant 8 25.962 (кг.)> #<variant 8 27.792 (кг.)>
; #<variant 8 29.612 (кг.)> #<variant 8 33.212 (кг.)> #<variant 8 36.762 (кг.)>
; #<variant 8 26.91 (кг.)> #<variant 8 28.75 (кг.)> #<variant 8 30.58 (кг.)>
; #<variant 8 32.4 (кг.)> #<variant 8 36.0 (кг.)> #<variant 8 39.55 (кг.)>
; #<variant 8 Custom>) (#<variant 8 22.391 х L (кг.)> #<variant 8 24.231 х L (кг.)>
; #<variant 8 26.061 х L (кг.)> #<variant 8 27.881 х L (кг.)>
; #<variant 8 31.481 х L (кг.)> #<variant 8 35.031 х L (кг.)>
; #<variant 8 24.122 х L (кг.)> #<variant 8 25.962х L (кг.)>
; #<variant 8 27.792 х L (кг.)> #<variant 8 29.612 х L (кг.)>
; #<variant 8 33.212 х L (кг.)> #<variant 8 36.762 х L (кг.)>
; #<variant 8 26.91 х L (кг.)> #<variant 8 28.75 х L (кг.)>
; #<variant 8 30.58 х L (кг.)> #<variant 8 32.4 х L (кг.)>
; #<variant 8 36.0 х L (кг.)> #<variant 8 39.55 х L (кг.)> #<variant 8 Custom>)
; nil
; nil
; (#<variant 8 www.mosflowline.ru> #<variant 8 Custom>))
Supermax
25.4.2007, 16:44
Решил я задачку по «встряске» свежевставленного динамического блока.
Дело в том, что в AutoCAD-e есть один глюк. Когда меняешь динамические свойства блока, он переименовывается со значения EffectiveName на *U… , а когда возвращаешь старое значение этих свойств, он на значение EffectiveName не возвращается. Если в это время вставить в чертеж еще один такой же блок, то в чертеже будут два абсолютно одинаковые по всем параметрам (кроме DXF пары 2) блока. У одного имя будет, как и EffectiveName, а у другого *U…
Задача была как-нибудь воздействовать на свежевставленный блок, чтобы он в DXF точечной паре 2 сравнялся с существующим *U…
Все оказалось очень просто:
(setq es (car (entsel)))
(setq ve (vlax-ename->vla-object es))
(setq DynPrs (vla-GetDynamicBlockProperties ve))
(setq props (vlax-variant-value DynPrs))
(setq lprs (vlax-safearray->list props))
(setq pr0 (nth 0 lprs))
(setq val (vlax-variant-value (vlax-get-property pr0 'value)))
(vlax-put-property pr0 'value val)
Получилось нечто вроде ATTSYNC только наверное это NAMESYNC
Читаем значение свойства value и записываем его же ему же.
На мой взгляд, процесс создания спецификации, а особенно создания выносок с позициями – самая утомительная часть проектирования. И если этот процесс автоматизировать, сэкономленными окажутся как время, так и нервы.
В ходе обдумывания этих вопросов пришел к следующему выводу:
У меня есть блоки (нединамические). Как правило, блок состоит из самого устройства, так и из сопутствующего фитинга: фланцев или муфт, например. В этих блоках-устройствах есть атрибуты –«Наименование», «№ опросного документа», «Код», в-общем, все графы, которые присутствуют в стандартной 9-графке.
Программой я вытаскиваю значения атрибутов и заполняю в template 9-графку. Таким образом в ГОСТовскую спецификацию записывается только «основное оборудование».
В excel экспортируются имена блоков, получается ведомость материалов со всеми фланцами, отводами и т.д. Особой программкой считаю рисую и считаю пустотелые трубы, которые потом вручную вбиваю в ведомость.
К сожалению, насос Grundfos я оспецифицировать (извиняюсь за неологизм) не смог.
Короче, выкладываю LISPы для спецификации, шаблон 9графки и пример участка трубопровода. Для работы нужно прописать в Lispах нужные пути.
Предупреждаю, программа еще находится в стадии написания, так что сильно не ругайтесь.
Может, быть совместными усилиями что-нибудь сваяем...
Ну, наконец-то!
У меня тоже до некоторых пор все блоки были простые, 9-ти графку заполнял после обработки модели (подсчета) макросом, размещенным в начале темы. Блоки состоят только из элементов, которые принадлежат изделию, болты, гйки, фланцы и прочее постоянно таскаемое вслед за этими изделиями сделано своими блоками и поэтому тоже считается.
НО!
После изготовления мною динамического блока трубы ППУ, а также после обсуждения проблемы источника информации об изделии (которая должна быть только от производителя, без копирайта), я наконец-то изготовил первое "виртуальное изделие". Нет, вы не подумайте, что я куда-то перехожу, я и по именам подсчет оставлю. В блоках динамических, есть одна особенность, динамические атрибуты при их изменении влияют на подсчет количества, а простые атрибуты на подсчет количества не влияют. Все, чисто технические характеристики, которые определяют "лицо" изделия выполняются динамическими атрибутами, а сопутствующая информация (маркировка по схеме, раздел проекта и т.п.) простыми атрибутами.
Вашу прогу испытаю, как только освобожусь.
Сделал второй проект прокладки теплотрассы в ППУ дин. трубами - просто ураган так быстро!
Длины подсчитал старой считалкой, даже *U не смутило. Клацаешь по трубе и в свойствах видишь ее длинну - это же здорово!
К стати, у тебя старый насос стоит, ты скачай мой новый, с дин. атрибутами.
Да и мой теплопункт тоже будет тебе весьма полезен "на запчасти".
Евгений97
4.5.2007, 15:23
дык есть спдс графикс вроде?
Для Vorn-a
Сваять совместно можно, только если после этого мы не подеремся. Я ведь для бесплатного распостранения ее делаю. Не подумайте, что с ума сшедший, интерес есть, да еще какой! А так - не против. Первым делом решаем вопрос: надо всю модель с начала проверить на "коректность", или при подсчете проверять в порядке поступления? Потом решаем, что считать корректным. Потом решаем как будем выбирать группу элементов для подсчета и т.д.
Представь себе (ничего, что на ты?) модель 100-этажного небоскреба со всеми подробностями вплоть до гаек и болтов. Ясен пень, что это не один файл, а целая куча со ссылками. Ясно также, что модель эту делает не один человек и даже не одна организация. Также понятно, что детали там от всяких разных производителей и из разных стран. Проектировщики, понятно, тоже понатырили друг у друга, да и сами наваяли много всякого несуразного. Вот такую модель и надо не только просчитать, а еще связать с MS Project-ом или другими программами для планирования. Также не плохо (и даже просто необходимо) раз уж есть указание на сайты и номера в каталогах попытаться скачать что возможно из прайсов на этих сйтах. Тот кто будет выкладывать на сайты свою продукцию в виртуальном виде об этом позаботится.
Ну как задачка?
Supermax
14.6.2007, 14:44
Написал обработчики виртуальных деталей, разобрался с динамическими блоками и написал все опции по их обработке, написал входную часть с формированием выбора по разделам проекта и вообще по всему, что только можно было и осталось только все это связать друг с другом
.
Задачу поставил создать набор секущей, или не секущей рамкой из элементов "корня" модели и элементов внешних ссылок, попавших в эту рамку.
.
Тактика следующая:
Создаем первый набор (ss1), в который входят все попадающие в рамку элементы и внешние ссылки, если их зацепило.
.
(command "_.select" "BOX" (setq nnn1 (getpoint)) (setq nnn2 (getcorner nnn1)) ^C^C)
(setq ss1 (if (< (car nnn1) (car nnn2)) (ssget "_W" nnn1 nnn2) (ssget "_C" nnn1 nnn2)))
.
Как видите, не просто создается набор, а еще и сохранены в переменных nnn1 и nnn2 координаты точек вставки рамки. В зависимости от их значений определяется тип рамки (секущая, или нет).
.
Далее, находим в этом наборе внешние ссылки и создаем из низ новый набор, а в исходном убиваем.
Далее, включаем ручки у первой внешней ссылки и запускаем комманду _-refedit.
Далее в открытой внешней ссылке добавляем в набор ss1 элементы набора ss2 созданного в открытой внешней ссылке. Да, элементы «корня» модели видны и выбираются, но при добавлении в ss1 не включаются, поскольку дубликаты.
(setq ss2 (if (< (car nnn1) (car nnn2)) (ssget "_W" nnn1 nnn2) (ssget "_C" nnn1 nnn2)))
Далее закрываем внешнюю ссылку. Открыть следующую, и т.д.
.
Команда _-refedit отличная команда, работает в текущих координатах и имея в памяти координаты рамки легко создается автоматически набор из ее элементов,
.
Если написать внешнюю программу, например на С++, реагирующую на изменение системной переменной и эмулирующая перемещение курсора и нажатие левой кнопки мыши, то можно будет из AutoLisp-a не особо задумываясь управлять любыми окнами, любых программ, включая элементы меню "Пуск".
Ээээ... Я попробовал въехать в смысл, получилось не очень, каюсь. Можно высказаться немного по общим вопросам?
Дело в том, что в ADT, например, при создании спецификаций производится запрос области, по которой выполнять подсчет. Но! Если в нее попадают внешние ссылки, то подсчет производится по всему содержимому внешней ссылки, невзирая на то, попали или нет "подсчитываемые объекты" в область выбора. Может, так более правильно? Если да, то сейчас попробую наваять код. Если получится - выложу.
Supermax
15.6.2007, 10:19
И правильно и нет. Если писать что-то стоящее (я не про ADT), то нужен как локальный, так и глобальный выбор. У меня с начала идет диалог, предлагающий выбрать способ выбора, а затем уж отрабатывать элементы этого выбора.
Пример: Модель здания 17 этажей, из них 10 типовых, вставленных как внещние ссылки. То есть файл один, только вставлен 10 раз с разными координатами. Идет процесс создания спецификации. Помимо прочего вставлена внешняя ссылка со стояками канализации, водопровода и пр. Это уже другая внешняя ссылка, только "по вериткали" , на весь дом одна. Надо подсчитать количество элементов на этаже. Можно конечно наделать во внешних ссылках кучу слоев, но автор умер и сделать это некому.
А так - обвел, и на тебе.
Стоп, погоди. Если в активный набор попала одна и та же внешняя ссылка, например, 2 раза, то надо(по моей логике) пройти по всему составу первой внешней ссылки, потом - по второй. То есть количество блоков попросту умножается на 2. Фильтровать набор лично мне было лениво, проще рекурсию написать

Зачем делать там "кучу слоев", я не очень догоняю.
Supermax
16.6.2007, 12:02
Если в набор попало 2 внешних ссылки, например 1-й и втрой типовые этажи, то иэлементы обеих копий этой ссылки, попавшие в сектор рамки пополняют набор. Естественно это происходит при поочередном открытии командой _-refedit этих ссылок. Имена элементов в копиях разные, поэтому копий нет.
Про слои я написал в негативном смысле, дескать так можно, но нет гарантии, что этот подвиг будут совершать все и всегда.
А рекурсия - естественно! Ссылки ведь не только в "ширь" идут, а еще и "влубь". Про умножение - забудь. Я хочу знать объем материалов на правое крыло здания, а у меня ссылки на ЦЕЛЫЕ этажи, да еще и общие коммуникации в высь простираются, а мне надо участок всего этого! Проблемы текущего финансирования знаешь?
Supermax
16.6.2007, 14:25
Последние изыскания в области открытия внешних ссылок автоматически:
С целью (надеюсь) указания мне на недостатки, или альтернативные, еще не использованные мною способы, выкладываю "нутро".
; создаем адреса рамки выбора nnn1 и nnn2
(command "_.select" "BOX" (setq nnn1 (getpoint)) (setq nnn2 (getcorner nnn1)) ^C^C)
;
; загружаем функцию _owp, которая должна по имени берущимся из переменной as включать ручки у ссылки и ее открывать.
; Затем предполагалось запускать в ней функцию f_ss, которая будет далее. и закрывать ссылку.
; Все работает кроме см. ниже
;
(defun _owp (as / ); переменная as - это одно из начений списка из имен ссылок см. далее mapcar
(ssdel as ss1); удаляем из корневого набора текущую ссылку
(setq nssn (ssadd))
(sssetfirst nil (ssadd as nssn))
(command "_-refedit" "O" "All" "N")
;(f_ss); не работает рекурсия
; сюда надо будет мне добавить создание набора
;
(setq nab nil ns 0)
(command "REFCLOSE" "D")); конец функции _owp
;
; создаем указатель на лист и устанавливаем счетчик наборов, он же вхождений в 0.
(setq u_obj (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
(setq n_ss 0 ns 0)
;
; Загружаем функцию f_ss
(defun f_ss ( / ) (setq n_ss (1+ n_ss)); сразу прибавляем 1, так что все наборы начинаются с **1
;
(set (read (strcat "ss" (itoa n_ss))) (if (< (car nnn1) (car nnn2)) (ssget "_W" nnn1 nnn2) (ssget "_C" nnn1 nnn2)))
; конец формирования набора с порядковым номером и именем начинающимся с ss*
;
(mapcar '_owp; далее идет формирование списка из имен ссылок
(set (read (strcat "sp" (itoa n_ss))) (progn
(while (setq _ewa (ssname (vl-symbol-value (read (strcat "ss" (itoa n_ss)))) ns))
(setq _ew (assoc 2 (entget _ewa)))
(if (and (vl-symbol-value '_ew) (= (vla-get-IsXRef (vla-Item u_obj (cdr _ew))) :vlax-true))
(setq nab (append nab (list (ssname (vl-symbol-value (read (strcat "ss" (itoa n_ss)))) ns)))))
(setq ns (1+ ns)))
(setq nab nab))
); конец формирования списка ссылок с порядковым номером
); конец функции mapcar
;
(setq nab nil ns 0); это так, на всякий случай лишний раз обнулил счетчики
;
); конец функции f_ss
В функции _owp я пока не вставил создание набора из элементов внешней ссылки, поскольку не был уверен, что именно в нее надо вставлять эту прелесть. Если бы можно было выполнить рекурсию, то выбор элементов должен был бы вставлен в функцию f_ss.
А теперь главная новость. _-refedit нельзя запустить в нутри открытой внешней ссылки. По краеней мере напрямую. Есть вариант создания копии команды, но под другим именем, вопрос изучается. Рекурсия накрылась медным тазом. Пока можно добавлять в "корневой" набор только элементы первого уровня вложенности во внешнюю ссылку, а открыть ссылки дальше - нет. Но и то не плохо.
Supermax
16.6.2007, 15:02
Так, у меня есть файл с детальками, я назвал его "исходный". Его я вставил ссылкой в файл, который назвал "1-ое вложение". В следующий файл я ссылкой вставил "1-ое вложение" и назвал его "2-ое вложение". В следующий файл я ссылкой вставил "2-ое вложение" и назвал его "3-ее вложение".
Запуская _-refedit я могу выбрать любое вложение и войти. Осталось только выбрав "корневую" ссылку узнать перечень всех ссылок в нутри нее и поочереди из "корня" их refedit-ом перебрать.
Затык. Как указать refedit-у на нужное вложение из лиспа?
Что ответить в письменном виде на запрос refedit - Select reference: ???????
Сразу скажу - наименование ссылки не катит, тем более, что копии ссылки в файле имеют одинаковые имена. Да и refedit ругается:
*Invalid selection*
Expects a single object.
; error: Function cancelled
Думаю попробовать ручки включить у внутренней ссылки.
Supermax
16.6.2007, 16:06
Эх, как быстро летит мысль. Все! придумал, и очень оказывается просто.
Я как сейчас действую?
1. Создаю корневой набор
2. Нахожу в нем ссылки и записываю их имена отдельным списком
3. Удаляю из набора эти элементы
4. По очереди открываю каждую и ее элементы вкидываю в корневой набор
а далее я буду делать так:
5. У меня в корневом наборе появятся ссылки из внешних ссылок
6. Я из них опять создам список
7. И опять поочереди все открою.
И так до тех пор, пока в корневом наборе не останется внешних ссылок
Supermax
16.6.2007, 19:42
Все, опять стоп. Имена взятые из набора и являющиеся элементами внешней ссылки из корня модели не читаются, а значит не подсвечиваются и значит не открываются. Если я читаю имя элемента из корня модели, то я его и подсвечиваю, да и вообще, делаю с ним что угодно.
(entget (nth 0 (nth 0 (reverse (setq rezultat (nentsel "Укажи блок:"))))))
Если я взял и включил элемент в набор из открытой ссылки, то выйдя из нее я с этим элементом по его имени ничего сделать не могу, даже entget!
В наборе куча имен, а добраться до внутренностей этих элементов нельзя. Более того, при следующем вхождении в эту же ссылку имена, которые получаются из набора функцией ssname уже другие. Вот засада....!
Так, ты меня совсем запутал. Я тебе расскажу свое видение твоей проблемы, ладно? Только не бушуй.
Примерная схема, по которой строится "Исходный", я вижу такой (см.аттач).
Соответственно в зависимости от того, на какую секцию ты кликнул, находясь в "Исходном", определит, какую часть проекта считать (кстати,в ADT именно по такой логике и делается проект, я оттуда идею спер).
Код, который проходит по всем внешним ссылкам независимо от уровня их вложенности, я показать не смогу (связан обязательствами), но компилированный (если правообладатель даст добро) выложить смогу.
А с выбором и подсчетом "внутри него" ИМХО ты зря заморочился.
Supermax
18.6.2007, 12:35
Смотри, есть простанство модели, в котором стоит модель дома. Модель эта состоит из элементов, находящихся в этом пространстве. Под элементами я подразумеваю все примитивы и блоки. К ссылкам это не относится. Также, частью модели дома являются внешние ссылки. Хоть они и родственны блокам, но всеж не блоки.
И так, перед нами модель.
Она разбита на огромное количество слоев. В список которых включены еще слои из внешних ссылок.
Часть элементов модели объединена в группы.
Есть еще и внешние ссылки, которые тоже нечто вроде объединенных груп.
Ссылки не отображают какой либо этап строительства или раздел проекта, они создаются как модель части здания.
Могут быть (а на самом деле уже есть) части здания, такие как вентиляционные, электрические и сантехнические стояки и шахты лифтов. Это цельный кусок модели и он тоже представлен ссылкой.
Основной концепцией моего подхода являлась и является догма, что информацию о принадлежности элемента к разделу проекта, этапу строительства, системе, группе материалов и пр. должна нести сама деталь или лейбл, который оперирует элементами (примитивами) как источником сведений о длине, объеме, площади.
Для редактирования например позиции "этап строительства" надо выделить в модели группу элементов и специальной подсобной прогой поголовно всем из этой группы поменять данные в этой графе атрибутов.
А элементы (некоторые) могут лежать во внешней ссылке. Ведь шахту лифта нельзя построить одним этапом. Ее по кусочкам строят на разных этапах. А проектируют ее цельно, а то упаси бог на 10 см. где нибудь не попасть. А к какому этапу строительства будет относится данный фрагмент, на этапе проектирования проектировщики знать не могут. Это узнается только после того, когда определен принцип финансирования (с накоплений или поступлений).
В общем о злободневном:
Я могу (пока) включать ручки у любых элементов в нутри ссылок, на каких бы они уровнях не залегали. Но только по одиночке, указывая их курсором мыши. После чего я с ними могу делать что хочу. Даже синхронизирую имя блоков (старая тема). Для того, чтобы мне открыть нужную ссылку _refedit-ом мне надо знать полный перечень ссылок и их (-1 . <Entity name: 7ef820a8>), чтобы этим ссылкам ручки включать. Refedit автоматом входит в ссылку, только если ей включить ручки (точнее одну единственную).
При входе в редактор ссылок "вручную" я имею возможность выбора нужной мне ссылки, а вот программно сделать этот выбор не так просто, как оказывается.
Готов присоединиться к проэкту.
Если надо написать чего на лиспе, ну там функцию какуюнибудь то не стесняйтесь обращайтесь, сделаем.
А вот с Крысом спорить не надо. Он дело говорит. Почитайте "САПР на базе...." там очень весело и подробно описано кто будет пользователем ваших программ если вы будете их криво делать.
Слегка оффтопа:
Поперше всего, mmax, приветствую

Ты хочешь задание? Их есть у меня

А если нет, то придумаю

Во-вторых, заказчик сказал примерно следующее: "сделай мне подсчет для неоткрытого файла, и компилированный код можешь выкладывать" (правда, так загадочно улыбнулся, что у меня мурашки по спине побежали). Блин, я не ожидал, что ObjectDBX столько проблем породит... Без него-то для активного документа уже сделан код (проход целиком по файлу; проход по списку объектов; проход по выбору).
Теперь о деле.
> Supermax : я попробую по пунктам, ок? А то я вроде как запутываюсь...
Цитата
Под элементами я подразумеваю все примитивы и блоки. К ссылкам это не относится. Также, частью модели дома являются внешние ссылки. Хоть они и родственны блокам, но всеж не блоки.
Ну вообще-то если на них посмотреть (хоть через (entget), хоть через (vla-get-objectname)) то у них вся разница в свойстве Path, IsXref и XRefDatabase (последние 2 для описания блока). А доступ к их составу абсолютно одинаков.
Цитата
Она разбита на огромное количество слоев. В список которых включены еще слои из внешних ссылок.
Часть элементов модели объединена в группы.
Ээээ... А зачем это знать при подсчете элементов? Или...
Стоп! Ты что, хочешь еще и логистику сюда подключить? И полное планирование выполнять? Это называется БКК (Большая Красная Кнопка - нажал и получай деньги). Нереал ИМХО.
Я ставил задачу попроще - получить полный список блоков (и не только блоков - вообще примитивов, отвечающих определенным требованиям, например, имеющих ldata моего приложения) как минимум по активному документу. С указанием количества. А потом выводить полученные данные в любое место - хоть в многострочный текст, хоть в таблицу, хоть во внешний файл.
---
Еще раз говорю -
если проходить целиком по внешним ссылкам, не фильтруя их состав, то получить список видаКод
'((("name" . <ИмяБлока1>) ("dynprop1" . <ЗначениеДинСвойства1>) ("dynprop2" . <ЗначениеДинСвойства2>) ... ("dynpropN" . <ЗначениеДинСвойстваN>) ("Атрибут1" . <ЗначениеАтрибута1>) ("Атрибут2" . <ЗначениеАтрибута2>) ... ("АтрибутN" . <ЗначениеАтрибутаN>) ("Кол" . <КоличествоВхождений>)
(("name" . <ИмяБлока2>) ("dynprop1" . <ЗначениеДинСвойства1>) ("dynprop2" . <ЗначениеДинСвойства2>) ... ("dynpropN" . <ЗначениеДинСвойстваN>) ("Атрибут1" . <ЗначениеАтрибута1>) ("Атрибут2" . <ЗначениеАтрибута2>) ... ("АтрибутN" . <ЗначениеАтрибутаN>) ("Кол" . <КоличествоВхождений>)))
с учетом внешних ссылок любого уровня вложенности особых проблем не составляет. Для активного (текущего) документа
В обчем так. Кое-что получилось. Правда, немного через пятую точку, но по другому я не дотумкал как сделать. Во вложении - fas-файл + readme. Там все написано

Тестируйте.
Заархивировано WinRAR 3.50.
---
Добавлено: lsp файл (Если он включен в архив) нерабочий!!! Гарантированного результата не дает!
---
<Приложенный файл удален. В постах #145 и #146 лежит исправленный рабочий (по крайней мере надеюсь на это) вариант.>
Mmax-у от SuperMax-a.
Ты можешь включить ручку (поскольку она одна) у внешней ссылки, лежащей внутри внешней ссылки?
Интересный каламбур получился однако.
Сразу скажу что есть - подсвеченная внешняя ссылка (в смысле ручка включена, DXF пара с кодом -1, да и вообще все DXF коды через функцию ssget полученные), в которой надо покапаться.
Кpblc-у Ну ты горазд ваять! Осталось только получить указатель на вхождение блока ent.
Вообще, я покапаюсь. Поскольку другого выхода не вижу. Начну с сокращения лиспа за счет убиения лишних переменных начинающихся с kpblc... Далее выброшу функции (но только очень аккуратно, чтобы не повредить другие функции) считающие блоки и прочие меня не интересующие. Понятно дело, исходный файл я оставлю (вдруг когда-нибудь пригодится). Вообще-то не дело, если человек просит стакан воды, выливать на него целое ведро. Я вроде русским языком выражаюсь НАДО ВКЛЮЧАТЬ РУЧКИ У ССЫЛОК! Прямого ответа получить не могу. Я понимаю, проверяющий (ежели такой имеется) глянув на открытый код main.lsp должен очень сильно напрячься чтобы понять, сообщил ты мне государственную тайну или нет. Сообщаю: если и сообщил, то до адресата она не дошла (пока). Вот если маленький редми к ней написать, тогда может и дойдет.
Supermax
19.6.2007, 15:31
В хелпе к каду в описании VBA есть и структура внешних ссылок, и вся структура объектной модели и методы даны как с ней работать, но что касается лиспа - очень жиденько и не внятно. Буду ручки включать через VBA. Маразм? - Знаю!, но другого выхода у меня нет.
Миф о всемогуществе AutoLispa и Visual Lispa тает у меня в мозгу, как снег в костре.
Все методы содраны из ActiveX тобишь С++. Доступ к примитивам просто кашмарный! Все что и так сделать можно - на поверхности и вызывает серьезные сомнения в преимуществе. То что быстрее - так ведь к С++ ближе, а на нем весь кад сделан, не заслуга это самого языка, а сворованное качество! А вот качества в частности и не видно, ни в сервисе написания диалоговых окон, ни в описании функций ни в чем. Такое впечатление, что разработки AutoCAD-a просто для себя ваяли функции, а заодно и подзаработать решили. Зачем добру пропадать! Полещук Н.Н. так прямо и пишет в Разработке приложений и адаптации, что дескать не охотно авторы идут на описание функций доступа к примитивам, а те что и описывают, так очень уж сильно поверхностно. Редактор лиспа в каде просто кошмарный. Я им пользуюсь только по праздникам, да и то, после долго руки мою. В простом блокноте куда более удобно работать.
Да, к стати, никто часом не знает как в редакторе лиспа шрифтец поменять? А то он такой убогий, жирно-грязный, что смотреть на него - сил нету. В Экселе скобки разного цвета - по парам, нет чтобы и здесь такое сделать, так нет же - функцию сварганили для проверки парности - полная шизофрения!
AutoCAD идет по пути Windows. Развитие этой программы более не возможно без развития программных продуктов с ней связанных. Качество этих продуктов на прямую определяет и спрос на сам AutoCAD. Не за горами тот день, когда проектирование претерпит очень серьезные изменения (я про переход к моделированию объектов как главного требования к проекту). А качество сопутствующих программ целиком и полностью зависит от открытости и дружелюбности как самой объектной модели, так и средств работы с ней. А тут какие-то тайны Мадридского двора, понимаешь!
Ссылку найти в документе не могу. БЛИН!
Блин, main.lsp нерабочая версия, там лишнего полно, и некоторых вещей не хватало. Случайно подчепилось. Так что ее можешь и не смотреть. Все остальные лиспы у меня в CADWare открытым кодом лежат.
P.S. А вот теперь скажи тупому, на фига включать ручки, если можно программно сделать все что ты хотишь (и даже больше)? Подсветить примитив можно хоть через VBA, хоть через lisp : метод Highlight и аргумент True / False (о сопутствующих проблемах пока забудем). Включить ручки ты сможешь только через (sssetfirst), передав 2 раза одинаковые наборы примитивов. Оно надо, учитывая, что (sssetfirst) из-под лиспа (и VBA) корректно работает только в текущем документе, и может вызывать падение када (либо отказ от дальнейшей работы) в пространстве блока / внешней ссылки, даже открытой командными методами?
Ох, как хочется поспорить насчет ком.методов и расписать их проблемы... Бум такое делать?
Supermax
19.6.2007, 16:23
Во первых, ссылка - тоже "человек", от прочих элементов, в плане доступа отличаться не должна. В блок ведь лазить приходиться. Во вторых, подсветить примитив программно - его надо еще найти, а он бедолага в ссылке лежит, и только ручками (в смысле человеческими) его можно ткнуть и засветить (даже в ссылках на самом дне). Почему в VBA все как два пальца.. а тут такая ......! Спорить надо, только вот с предметом спора пока неувязочка. Я подозреваю, что все не спроста. Почему скажи AttachExternalReference есть, а прочесть то, что сваял - немоги? Все завязано на создание, поскольку это не раскрывает сущности, а вот редактирование - это уже надо сущность показывать, а тут конкуренция ...ее и связывание рук в плане изменения всяких разных составляющих.
За кад не беспокойся. Я VBA-шный макрос загружу заранее, он системную переменную (скорее несколько) будет "сторожить" и как только в ней появится признак срабатывания - посмотрит какие ссылки с включенными ручками и поголовно включит ручки всем ссылкам в нутри этих ссылок. Далее в другой системной переменной мне признак готовности скинет, и я из всех засвеченных элементов создам набор. Когда макрос VBA мне станет не нужен, я ему скину признак "выкл". Вся операция займет мгновение и она ведь один раз только делается. А набор распотрошить, думаю ты и сам знаешь как. После этого поочереди буду входить в ссылки и делать обработку элементов прямо там. Чтобы с именами не заморачиваться. Когда придумаю как на лиспе ссылки найти - переделаю.
Supermax
19.6.2007, 16:42
"метод Highlight и аргумент True / False (о сопутствующих проблемах пока забудем). Включить ручки ты сможешь только через (sssetfirst), "
В кинофильме про трех мушкетеров (с Боярским в гл. роли) есть такой эпизод: Фанат миледи говорит (с акцентом) "Имя! Скажи мне имя!" Вот и я говорю DXF код -1 и я тебе включу что хочешь! Только он может быть вставлен в набор, и только после этого этот набор можно "включить".
Занавес!
Цитата
Во первых, ссылка - тоже "человек", от прочих элементов, в плане доступа отличаться не должна.
Теоретически - да. Практически - некоторые отличия есть.
Цитата
Во вторых, подсветить примитив программно
Ты так и не ответил,
зачем тебе подсвечивать примитив. Да еще и ручками. Лично я в этом не вижу никакого смысла.
Цитата
Почему скажи AttachExternalReference есть, а прочесть то, что сваял - немоги?
А справку посмотреть внимательно?
Цитата
Signature
RetVal = object.AttachExternalReference (PathName, Name, InsertionPoint, XScale, YScale, ZScale, Rotation, bOverlay [, Password])
Ну и где ты тут видишь "невозможность получить что наваял"? Предваряя вопрос "а как в лиспе": да легко!
Код
(setq
xref (vla-attachexternalreference
(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
"c:\\temp\\temp.dwg"
"temp.dwg"
(vlax-3d-point '(0. 0. 0.))
1.
1.
1.
0.
:vlax-false
);_ end of vla-attachexternalreference
);_ end of setq
Ну или наподобие того. И работай со своей xref как душе угодно.
Цитата
VBA-шный макрос загружу заранее, он системную переменную (скорее несколько) будет "сторожить"
Реактор на системные переменные на VBA писать собираешься? Не слишком ли круто? ИМХО - лишнее. Или командный реактор? Или реактор документа? Помрешь писавши, потом отлаживавши, потом отказываясь от его применения, поскольку все ситуации все равно не уследишь. Можешь мне поверить, я знаю, про что говорю (у меня используется реактор на двойной клик мыши, казалось бы, все учел, ан нет, сегодня выдали - не все!)
Цитата
В кинофильме про трех мушкетеров (с Боярским в гл. роли) есть такой эпизод: Фанат миледи говорит (с акцентом) "Имя! Скажи мне имя!"
Ну, я не фанат, да и acad не миледи, хотя мозги парит изрядно.
Слушай, давай договоримся - имя есть у блока, у его описания, у ссылки, наконец. У отрезка имени нет. Есть его хендл, есть указатель на него. Но не имя!
Проверни следующее:
Код
(defun c:tt (/ ent)
(vl-load-com)
(setq ent
(entmakex
(list (cons 0 "LINE") (cons 10 '(0. 0. 0.)) (cons 11 '(10. 100. 0.)))
);_ end of entmakex
);_ end of setq
(princ (strcat "\nent-указатель : " (vl-princ-to-string ent)))
(princ (strcat "\nHandle by ent: \"" (cdr (assoc 5 (entget ent))) "\""))
(princ
(strcat "\nDXF -1 : "
(vl-princ-to-string (setq ent_pointer (cdr (assoc -1 (entget ent)))))
);_ end of strcat
);_ end of princ
(princ (strcat "\nvla-указатель : "
(vl-princ-to-string (setq ent (vlax-ename->vla-object ent)))
);_ end of strcat
);_ end of princ
(princ (strcat "\nHandle by vla : \"" (vla-get-handle ent) "\""))
(princ (strcat "\nvla->ename by handle : "
(vl-princ-to-string (handent (vla-get-handle ent)))
);_ end of strcat
);_ end of princ
(princ (strcat "\nvlax-vla-object->ename : "
(vl-princ-to-string (vlax-vla-object->ename ent))
);_ end of strcat
);_ end of princ
(textscr)
(princ)
);_ end of defun
И проанализируй полученные результаты. Примитив один и тот же, а добраться до него сколькими способами можно?
---
И все равно, объясни, чего ты хочешь от подсвечивания добиться. На фига оно надо? В глобальной, так сказать, задаче?
Имеются 3 файла 1 2 3 dwg
В 2 вложен 1
В 3 вложен 2
Мне удалось программно получить указатель на объект 1 в активном документе 3 и подсветить его и сохранить в переменной eobj.
Но
Чтото сделать с этим объектом при неактивной(закрытой) _refedit ничего не получается. Функция (entget eobj) возрашает nil. При этом команда !eobj возращает <Имя объекта: 7ef980a8>.
С VLA-add-get-put не баловался, но думаю что будет тоже самое. Хотя во время редактирования, по моему мнению, можно делать все что угодно и не только со ссылкой, имеется ввиду программно, например нарисовать окружность в другом space. Ограничений на запуск лисппрограмм нет.
Вывод:
Внешняя ссылка для вашей программы не подходит. Применять ее можно только как подложку или наглядное пособие не более.
Если пользователю захотелось проспецифицировать отдельные детали ссылки, то пускай он их внедряет. Тоесть делает их блоками итп.
Если желаете то могу написать корректный код? но что он вам даст?
Supermax
20.6.2007, 11:02
Начну с Kpbls-a
Команда _-refedit - единственное средство зайти во внешнюю ссылку не потеряв пространственного расположения элементов в "корневой" системе координат.
.
Сразу договоримся, "корень" модели - это то пространство, которое ты видишь при открытии файла в закладке Модель.
Это пространство имеет свои X, Y, Z которые и есть текущаяя система координат.
В этом пространсве расположена внешняя ссылка. Она может быть вставлена в это пространство со смещением и поворотом по этим осям. Я уже молчу, что может быть многократно скопирована в разные места пространства.
.
Ссылку можно открыть в своем окне (тобишь файле) или "по месту" командой _-refedit. При открытии командой _-refedit все элементы внешней ссылки становятся доступны но их расположение соответствует "корневой" системе координат, то есть они расположены так, как мы их видим из "корня".
При открытии ссылки в своем окне, элементы располагаются в "родной" системе координат, то есть той, которые были на момент создания файла ссылки.
.
Если мы хотим обработать сектор этой ссылки, но координаты этого сектора мы получили из "корня", то либо надо открыв внешнюю ссылку в своем окне, пересчитать координаты рамки выбора (включая и угол поворота), для чего надо знать координаты и угол поворота ссылки при вставке, для чего надо залезть в ее свойства в том пространстве, где она вставлена, а она вставлена в другую ссылку, а та вставлена в третью тоже со сдвигом и поворотом...
Не находите господа, что это через чур геморроидально?
.
Другой способ посчитать сектор, это открыть ссылку "по месту" _-refedit.
Но для того, чтобы это сделать автоматически, надо, либо знать наверняка X и Y точки, попадающей на какой-либо элемент этой ссылки, либо, включить ручки у этой ссылки и запустить _-refedit. Она в таком случае запрашивать уазания объекта не будет.
.
В случае указания точки, вы откроете только "верхнюю" ссылку. Глубже вам залезть не получится.
В случае включения ручки - надо знать DXF код (-1 . .............) с APP: имя примитива (изменяется в каждом сеансе редактирования рисунка) (см. лист 851 "AutoLisp и Visual Lisp в среде AutoCAD"). Причем то имя, которое приписано к этому элементу в "корневом" пространстве модели.
.
Если командой _-refedit зайти в ссылку, то там и имена свои и метки и vla-объекты. Работать с ними можно только не выходя из нее. Но если в пространстве созданном _-refedit есть еще и своя внешняя ссылка, то войти в нее увы вы не сможете. Войти в эту ссылку можно только из "корня" включив ей ручку.
.
Внешняя ссылка располагается в той же таблице, что и блоки, только она "безтелесна", то есть не имеет своего видимого тела, поэтому выбрать ее "методом тыка" не получается. Вот блок - другое дело!
.
Включив ручки у всех ссылок мы командой (ssget "I") создаем набор из элементов отмеченных ручками. Далее командой (ssname 0) поочередно, начиная с 0 читаем имя этого элемента соответствующее текущему пространству "корня". Далее это имя командой (ssadd ......) включаем в новый набор (из одного элемента) и командой (sssetfirst ......) включаем ручку у этой ссылки.
Далее мы запускаем _-refedit и входи в ссылку, делаем там шурум-бурум и выходим.
.
Для mmax-a Ручку у ссылки включил? - запусти (command "_.-refedit" "O" "All" "N")
.
Как только это у тебя получится - сигналь!
P.S. Мне ничего с объектом делать не надо, мне надо в него войти.
Ну, начнем с того, что лично я согласен с mmax - если надо считать "кусок" внешней ссылки, то либо внедрять ее, либо использовать более мелкую "разбивку".
Цитата
Не находите господа, что это через чур геморроидально?
Не-а. Рекурсия с последующей фильтрацией результатов и преобразованием точек - вот оно, решение

Дальше.
Цитата
В твоих примерах Kpbls я не увидел обратной процедуры
Ну, во-первых, она "спрятана" в fas. Во-вторых, ну не так мой ник-то пишется
Supermax
20.6.2007, 13:25
С ником это случайно, поскольку в голове держал слово крыс, извиняй. А вот рекурсией и разбиением ссылок - это ты мне предлагаешь чтобы посчитать кусочек модели всю ее превратить в кучу элементов, принадлежащих только этому файлу? А в случае переопределения этапов строительства и реквизитов поставщика, получается это только в этом файле и будет переопределено?
Я на типовом этаже в конкретном туалете, конкретный унитаз переназначил по всяким там параметрам, а остальные этажи - побоку? Так, с внешними ссылками, мое вмешательство автоматически распостранится на все копии этой ссылки, а так - будь добр трудись аж до старости.
А как работать в коллективе, где один - один файл ваяет, другой - другой? А тот, кто отвечает за cнабжение - должен работать со всеми файлами? Да еще и ссылки в одной модели вставлены так, а в другом файле - сяк. Файл один, а используют его как внешнюю ссылку несколько человек и каждый по своему. Автор поменял трубу, а у других она осталась прежней?
Ссылки это не только сокращение объема файла, это еще и возможность работать с фрилансерами. Я не собираюсь такую груду работы делать в одиночку. И прекратите ради бога выискивать у меня в тексте спорные моменты. Прогу я для всех делаю (или мы, если кто не против). Так давайте ее родимую ваять.
.
В прогу можно вставлять fas, если уж ты так дорожишь секретом, только надо договориться о тактике.
1. Подарть что либо можно только если ты это имеешь. В отношении программных продуктов это факт их регистрации как готового продукта.
Если это материал одного лица - распечатывается на бумаге текст исходника и нотариально заверяется дата создания. Затем можно и в палату идти регистрировать.
Если прога содержит недокументированные и не зарегистрированные функции, а без них она не пашет, то при последующей регистрации этих функций, как отдельных программ возникнет правовой инцидент, поскольку распостраняться программа будет комплектом, а она может быть и подарена, а автор функций с этим не согласен.....
2. На сколько мне известно без исходников нифига не зарегистрируешь, поскольку не возможно доказать нарушение авторских прав не имея возможности это нарушение предьявить к опознанию.
Я в начале темы поднимал вопрос об открытости кода и нотариальном сопровождении темы. Вот если бы за темой следил нотариус - тогда другое дело, можно писать любые секреты открыто, дата их создания автоматически равна дате появления на экранах мониторов. Но такого пока нет, поэтому и коды всякие только универсального назначения.
.
Выбор элементов модели секущей или простой рамкой по всем ссылкам и в текущем пространстве модели - вещь универсальная. ее можно использовать не только для обработки этх элементов в плане количества, а еще и для их переопределения, выделения, перенесения в другие слои, включеия в набор и пр.
.
К стати, я еще ни разу не пробовал создать набор из элементов находящихся в разных ссылках. Надо будет как нибудь попробовать.
Я ж вроде сказал, что пока у меня не получено добро на публикацию исходного кода. Как только - так сказу. А вот хочешь я всю твою малину по выбору и получению точек расколошмачу за 5 секунд?
Запускаешь
Код
(defun test ()
(mapcar '(lambda (x)
(entmakex x)
);_ end of lambda
'(((0 . "LINE") (10 2716.29 -479.869 0.0) (11 755.128 552.49 0.0))
((0 . "LINE") (10 569.456 -1320.84 0.0) (11 2524.81 -856.854 0.0))
((0 . "LINE") (10 1642.87 -21.6875 0.0) (11 459.214 -1030.85 0.0))
((0 . "LINE") (10 232.926 -456.67 0.0) (11 436.005 1115.07 0.0))
)
);_ end of mapcar
);_ end of defun
В ком.строке дай
Код
Command: _select
Select objects: _wp
А теперь внимание, задача! Получи вершины, по которым был построен полигон выбора. Как это сделать - и вообще, возможно ли,- я не знаю.
Это все было "нумер раз".
Теперь настает "нумер два".
Цитата
А вот рекурсией и разбиением ссылок - это ты мне предлагаешь чтобы посчитать кусочек модели всю ее превратить в кучу элементов, принадлежащих только этому файлу?
Во-первых, я не предлагаю сразу и одновременно использовать внедрение ссылок и рекурсию. Не надо за меня придумывать и договаривать. Почитай внимательно мой пост #91 (оффтоп: сейчас покажу тему одному товарищу, он вынесет вердикт - кто прав а кто нет).
Во-вторых.
Цитата
А в случае переопределения этапов строительства и реквизитов поставщика, получается это только в этом файле и будет переопределено?
Что значит "переопределения"? Ты что, атрибут в блоке поменял? Или в свойствах файла покопался?
Цитата
Я на типовом этаже в конкретном туалете, конкретный унитаз переназначил по всяким там параметрам, а остальные этажи - побоку?
Что значит "переназначил"?
Я, если честно, не понимаю, какая связь между подсчетом элементов и логистикой. Ну поменял ты атрибут (к примеру) у блока в какой-то внешней ссылке, ну и ладно. Запуск подсчета по новой - вуаля, оно подсчитано как надо.
Скажи, почему ты отказываешься напрочь от идеи сделать разбивку внешних ссылок более детализированной? Проблем будет на три порядка меньше.
---
Добавлено в 22:29:
Во, придумал пример! Смотри, ставишь ты оборудование (неважно какое - насос, вентилятор, козловой кран и т.п.). Вставляешь ты его внешней ссылкой. Теперь тебе надо для здания посчитать спецификацию. По выбранному полигону / региону. Ты выделяешь, и в этот полигон от твоего вентирятора попадает 1 лопасть, 2 болта, 3 винта и 4 гайки. И что, только это и будешь учитывать?
Уопщем так.
Создается такая программа которая подсчитывает блокрефы с определенными параметрами и заносит информацию о их названиях и количествах в спецификацию.
Вы пытаетесь навязать пользователям свою методику и свои блоки. А теперь назовите хоть одного человека который любит когда ему чтото навязывают и еще такого который относится с доверием к чужим блокам.
Все автокадчики привыкли к своим методикам и своим блокам со своими именами и комментариями.
Мы не можем угадать у кого сколько блоков, как их зовут и какие данные к ним прикреплены итп. И уж темболее не имеем права говорить пользователю какие блоки использовать и как их называть.
Но
Все блокрефы:
1. имеют происхождение от какогото одного блока.
2. имеют масштабы
Вот и все что их унифицирует. И только по этим двум параметрам можно их сортировать и специфицировать.
Если пользователь вставляет блок под названием UNITAZ в масштабе 1 и тотже блок в масштабе 2, то он вставил два разных изделия и в спецификацию они пойдут в разные места.
Тут шел разговор о красных кнопках. В настоящее время ниодин здравомыслящий человек не будет им доверять никогда. И когда спецификация отправится к заказчику он еще раз все перепроверит, пересчитав все изделия пальцем (исключения могут быть в госпредприятиях на которых не платят зарплату).
Программа должна быть маленькой и простой и должна дать пользователю право самому выбирать что и как делать.
Например:
Команда СПЕЦИФИЗД
Select object выбрали один блок
Далее выводится диалоговое окно в котором имеется информация о подсчитанных унитазах. Также в этом окне должны быть ячейки в которые пользователь может заполнять сам и их значения будут иметь более высокий приоритет чем программно посчитанная информация, ябы даже сказал, что эти ячейки будут иметь не приоритет а выносить вердикт. Например программа в плане жилого дома нашла 10 одинаковых унитазов, так как все остальные этажи не рисуются, то надо чтобы пользователь указал некий коэффициент по которому будет посчитано полное их количество во всем доме и на всякий случай сделать маленький текстбоксик в котором пользователь сам будет выносить окончательный вердикт количеству изделий независимо от коэффициента этажности, даже если он его указал.
Тоже самое касается имен и прочих столбцов спецификации, напрмер:
Наша программа вычислила имя блока и предложила в диалоге, в ячейке соответствующей графе спецификации НАЗВАНИЕ ИЗДЕЛИЯ, имя блока как название изделия, а пользователь, в свою очереть, должен иметь право вынести вердикт названию.
Также будет НЕочень уместно специфицировать каждое изделие поотдельности. Поэтому надо сделать диалог так чтобы полученная информация в нем могла выстраиваться последовательно на каждое изделие. Например вывести сразу екселевскую таблицу на экран.
_______________________________________________________________________
_______________________________________________________________________
Пользователь выбрал объекты рамкой и в набор попали задвижки и унитазы и в итоге в спецификации может получиться такая сумятица:
Унитазы 1 серии
Задвижки 5 серии
Унитазы 8 серии
Задвижки 125 серии
А они должны располагаться по группам да еще в алфавитном порядке.
Вывод:
Всетаки без определенных соглашений с пользователем не обойтись придется ему в свои любимые блоки вставлять наши метки по которым программа будет их идентифицировать. Надо сделать отдельный модуль который автоматически добавит необходимую информацию в блок пользователя
Пользователь выбирал челкая по отдельным объектам и забыл один. Программа должна сообщить пользователю, что в рисунке объектов больше чем указано в спецификации. С другой стороны объектов 10 а пользователь вынес вердикт, что их 5. Значит если пользователь выносит вердикт, то это дело надо пометить. Получается, что если такая метка присутствует то можно смело посылать его куда подальше и ничего больше не считать.
На жилых этажах на каждом этаже определенное количество изделий. На первом нежилом могут быть теже самые изделия но в другом количестве. План первого этажа в другом файле, а изделия специфицируются от подвала до крыши.
Вывод:
В екселевском файле должна быть наша метка которая указывает, что изделие уже занесено в спецификацию и информацию об изделии надо только пересчитать или добавить к имеющемуся, а не добавлять в новую строку.
В одну спецификацию заносится информация из разных файлов. Значит надо в екселе делать метки о том какая информация откуда попала. Ошибки неизбежны. Если при строительсьтве окажется что один унитаз лишний, то сильно ругать не будут, просто на голову его вам оденут, а потом прораб утащит его к себе домой. Если недосчитаются одного, то вас в нем утопят.
Итог:
А не лучше ли просто создать программку, для рисования табличек и сделать так чтобы в них было удобно заносить текст. Дабы не пришлось никому ходить с унитазом на голове.
Имеем три файла 1 2 3 двг
1 вложен в два
2 вложен в три
Работаем с третим файлом:
Код
(command "_-refedit")
И так далее
чтобы подсветить нужную ссылку надо выбирать ее по коду 2. которй хранит ее имя которое равно имени файла.
Код
;подсветим самую дальнюю 1.двг
(setq ss (ssget "_X" (list (cons 2 "1"))))
(sssetfirst nil ss)
при этом надо не забыть что в данном примере ссыка 2 будет подсвечиваться со ссылкой 1 так как ссылка 1 является примитивом файла 2
А вот сделать так чтобы не было окна с сообщением что ссылка сохранена неполучается ни программым ни ручным способом. При этом получается непонятная ситуация, если я внес в ссылку изменения, то теперь просто обязан их сохранить или остаться в рефедите. А находясь в рефедите не могу ни закрыть ни сохранить файл. Нажав ОК я могу угробить кучу сторонних файлов.
А если я захочу отказаться от редактирования ссылки, то что мне тогда делать. команда refclose предлагает мне либо сохранить измения в файлах ссылки либо выключать компьютор из розетки.
Или это всетаки глюк только Автокада 2007
Нет я вообще не буду пользоваться ссылками лучше copy paste так и овцы сыты и волки на воле. Ради размера файла не стоит на такие вещи и заморачиваться.
Supermax
23.6.2007, 13:12
Ну вы братцы и навалили мне работы!
Начну как всегда с (так, тут надо тщательнее) kpblc-а.
1. Ты ж вроде сказал, да я ж не то тебе ответил. Я сказал (пост 92), что секрет можно и не раскрывать, только использовать такую функцию надо корректно. Договорившись, лучше в письменном виде (даже не лучше, а обязательно).
2. Внимательно вчитайся в эту строку:
(command "_.select" "BOX" (setq nnn1 (getpoint)) (setq nnn2 (getcorner nnn1)) ^C^C)
Она ничего не делает. Не создает набор, не выделяет объекты – она только показвает рамку и сохраняет в переменных nnn1 и nnn2 координаты рамки. И даже при выходе, она не Enter нажимает (в таком случае было бы “”) а Esc. Что соответствует ^C^C.
Далее следует строка:
(set (read (strcat "ss" (itoa n_ss))) (if (< (car nnn1) (car nnn2)) (ssget "_W" nnn1 nnn2) (ssget "_C" nnn1 nnn2)))
Вместо (set (read (strcat "ss" (itoa n_ss))) …. Можно вставить (setq ss1 …..чтобы понятнее было
Для публики поясню: В зависимости от того, меньше или больше значение X точки nnn1 по отношению к значению X точки nnn2 создается набор либо секущей, либо простой рамкой с координатами рамки nnn1 –начальная точка и nnn2 – конечная точка и сохраняется в переменной ss1 (в первом случае номер множится).
Данную строку можно многократно запускать на одном и том же месте пространства (например открывая ссылки _-refedit-ом). Можно пополнять какую-нибудь базу, сведениями получившимися после обработки этого пространства, можно производить с элементами, попавшими в это пространство различные манипуляции.
Можно конечно и так:
(setq ss1 (ssget "_W" (setq nnn1 (getpoint)) (setq nnn2 (getcorner nnn1))))
Или так:
(setq ss1 (ssget "_C" (setq nnn1 (getpoint)) (setq nnn2 (getcorner nnn1))))
Но в этих случаях выбор (секущая или нет) предопределен, рамка белая и жирная.
Теперь рассмотрим твой пример автоматического рисования четырех линий.
Где ты их нарисовал и зачем? Ну, даже, если ты их нарисовал в том месте, где я произвожу подсчет, то я могу их посчитать (или то, что попадает в условия выбора, в смысле секущности). Раз с сохранением координат выбора проблем нет, перехожу дальше.
Даю пояснение к слову «переопределение». С начала считали, что отмостку будут делать на этапе нулевого цикла, а потом передумали и переопределили как работу этапа «благоустройство». К проектированию конструкции здания это не относится. Это моя головная боль, поскольку я занимаюсь «виртуальным строительством», то есть по готовому проекту имитирую в компьютере процесс строительства объекта. Увязывая действия многих подрядчиков между собой и заодно проверяю проект на «глюки» проектировщиков. А вот как я называюсь и где сижу – только в личку. Тут к стати ящики для участников форума есть.
А на счет атрибута – да. Этап строительства был – нулевой цикл, а стал благоустройство.
Далее. А вот тут ты за меня придумываешь. Когда и где я отказывался, или вообще рассуждал о детализации внешних ссылок? Ссылки есть и будут. Большие или маленькие, но все равно будут. Приведу живой пример. Проектная фирма (у меня за стенкой) человек не много, но все с пальцами веером и неслабой зарплатой. Выход продукции зависит от их настроения. Очень долго бились за производительность и наконец-то приняли следующее решение: Работа считается выполненной, если она положена в архив на центральном файл-сервере. Редактировать ее прямо там могут считанные единицы людей (и даже не всегда может сам автор). У других она – да, да, да – внешние ссылки. В конце месяца смотрят по журналу сервера сколько кто сделал и зарплату работника делят на количество сделанного.
Раньше никто не хотел записывать, кто и что его попросили сделать, а теперь сами придумывают.
Самое последнее. Козловой кран. Ты открой мой теплопункт и увидишь, что фильтры сетчатые ДУ-100 имеют свои гайки, болты и пр. детали, но они все объединены в блок и названы «фильтр сетчатый ДУ-100». Так и кран. Его надо с начала сделать краном, а не грудой элементов от крана, а уж затем этот файл вставлять ссылкой в другой. При открытии такого файла мы не получим никаких вентиляторов. Мы получим только один кран козловой.
Теперь mmax.
«Вы пытаетесь навязать пользователям свою методику и свои блоки. А теперь назовите хоть одного человека который любит когда ему чтото навязывают и еще такого который относится с доверием к чужим блокам.»
Во первых я имею на экране компьютера те же блоки и элементы чертежа что и вы. Моих блоков нет. Атрибуты к блокам придумал не я, иначе бы вы их не смогли увидеть. Состав атрибутов я не определяю (как между прочим многие мне навязывают). У меня и состав и написание и количество их оставлено на усмотрение пользователя.
Это к стати тоже многим не нравится. Говорят хочу сделать универсальную прогу, а это недостижимо.
Слово «навязать» имеет несколько негативный характер. Я и сам не люблю, когда мне навязывают и другим этого стараюсь не делать, а вот термин «убедить» мне больше по душе. Да, я во многих вещах убежденный человек, а это значит, что меня можно в чем-то разубедить.
Вся моя методика сводится к строению тела программы и к тому, что она сможет считать. И я вам даже еще раз перечислю.
1. Простые блоки – по именам, как это делает макрос на VBA лежащий в первом сообщении темы.
2. Блоки динамические и не динамические с атрибутами – по данным атрибутов с их сортировкой по этапам строительства, разделам проекта, системам, категориям и другими параметрами определяемыми пользователем в файле-маршрутизаторе.
3. Виртуальные материалы и изделия, (то есть такие, которые представлены не в виде модели, а в виде условного параметра длинны, площади, объема и т.п. взятого с примитивов типа линии, плоскости, солиды и т.п.) – по данным атрибутов с их сортировкой по этапам строительства, разделам проекта, системам, категориям и другими параметрами определяемыми пользователем в файле-маршрутизаторе.
Вот пожалуй и все. Если есть еще что-нибудь – скажите, у меня фантазия на этом исчерпалась.
Да, я маршрутизатор, (то есть такой детал, который показывает проге маршрют ее продвижения, то есть какой раздел делится на какие подразделы, в какой последовательности вести подсчет и вообще чего искать в свойствах атрибутов?) сделал на Эселе, а не на СУБД-шной базе или в блокноте – вот какой я тиран и угнетатель пользователей. Они хотят Access а я им гад даю Excel.
Количество элементов «в точности» никогда не закупается. И кабель, и трубы и те же унитазы покупаются с процентовкой в соответствии с нормами сметы. Данные проектировщика никогда не идут напрямую в работу. Только после сметчика. Про «никогда» я пожалуй поторопился, забыл где живу.
Да, красные кнопки многие не любят. Страшно. А вдруг, что не так? Но я кранные тоже не люблю, вот фиолетовые, или в крайнем случае зеленые – другое дело.
Программа не должна быть настроена на окончательное действие. Ведь в работе нужно постоянно иметь возможность локального подсчета, чтобы оценить правильность общей концепции. Поэтому и выбор рамкой, и возможность иметь маршрутизатор ко всем проектам свой, и таблицы чтобы были любые, от самых примитивных в три столбца, до технологических карт и листов ресурсов к М.S. Рroject-у.
Про заказчиков и их отношение к автоматизму я знаю не понаслышке. Когда объем бетонирования заваливает за 10000 м3, пальчик, которым считают, отсохнет у любого. Заказчик знает о процентах на «утруску – усушку», но закладывать их в объем закупок – только его прерогатива, и его же ответственность. Я лично сдавал объемы бетонирования по 3D модели, и могу судить о таких вещах.
Про забытые детали:
Есть такая проблема, но она не потому, что пользователь не нажал на деталь курсором, а потому, что деталь относится к группе подсчитываемых, но ни в один набор не попала. То ли атрибута какого-то не хватило, то –ли в маршрутезаторе про такую разновидность материализма забыли указать. Но тем не менее, все элементы подлежащие учету выбраны, обработаны и распределены по группам, а те, что остались – предъявлены к «опознанию» и решению их дальнейшей судьбы.
С кодом – (setq ss (ssget "_X" (list (cons 2 "*")))) - Выберает все элементы с кодом 2, кроме тех, что находятся в нутрии внешних ссылок. Не веришь? Накидай в 1.dwg блоков, они тоже имеют такую пару и посчитай длину набора (функция sslength).
Ну про сохранение ссылки это ты зря. Выбор есть. Я все время выхожу так:
(command "REFCLOSE" "D") А хотел бы сохранятся, поставил бы “S”.
Сколько болтовни я все и усвоить не могу.
Ну сделайте просто программу которая просто подсчитывает в 1 открытом документе блокрефы с одинаковыми именами, масштабами и атрибутами или с отсортировкой атрибутов. И все. Как два пальца об асфальт.
далее пользователь сам решит что ему надо сделать. В конце концов он сам разрабатывал проэкт и знает где чего и сколько.
В ссылки лазать не надо, потомучто пользователь может спокойно открыть документ на который вставлена ссылка и там спокойно запустив вашу программу все пересчитать и добавить в общий подсчет. Главное чтобы ваша программа была адаптирована к работе с несколькими документами.
Тоесть подсчитали в одном документе. Перешли в следующий, программа спрашивает, начать новую спецификацию или добавить в созданные.
а если вы попытаетесь автоматизировать процесс полностью, недавая пользователю контроля, то у него будет очко дрожать когда он будет передавать документы по инстанциям
Цитата(Supermax @ 23.6.2007, 10:12)

С кодом – (setq ss (ssget "_X" (list (cons 2 "*")))) - Выберает все элементы с кодом 2, кроме тех, что находятся в нутрии внешних ссылок. Не веришь? Накидай в 1.dwg блоков, они тоже имеют такую пару и посчитай длину набора (функция sslength).
Ну про сохранение ссылки это ты зря. Выбор есть. Я все время выхожу так:
(command "REFCLOSE" "D") А хотел бы сохранятся, поставил бы “S”.
Я вам руку зажег? Код (2 . 1) говорит о том что ссылка имеет имя файла 1 без DWG.
Изначально разработчиками акада в этом разделе была заложена полная жопа. и нет смысла пытаться ее раздвинуть
> Supermax :
Цитата
Внимательно вчитайся в эту строку:
(command "_.select" "BOX" (setq nnn1 (getpoint)) (setq nnn2 (getcorner nnn1)) ^C^C)
Вчитался. Проникся. Всплылил, был неправ. Это я про себя.
Наверное, дело в том, что как только вижу DIESEL-выражения, не примененные к RTEXT или modemacro, я их даже не анализирую. Да и твой код, кстати, можно сделать более удобным для применения:
Код
(if
(and
(not
(vl-catch-all-error-p
(vl-catch-all-apply
'(lambda ()
(setq nn1 (getpoint "\nНачальная точка рамки выбора <Отмена> : "))
);_ end of lambda
);_ end of vl-catch-all-apply
);_ end of vl-catch-all-error-p
);_ end of not
nn1
(not (vl-catch-all-error-p
(vl-catch-all-apply
'(lambda ()
(setq
nn2 (getcorner nn1 "\nКонечная точка рамки выбора <Отмена> : ")
);_ end of setq
);_ end of lambda
);_ end of vl-catch-all-apply
);_ end of vl-catch-all-error-p
);_ end of not
nn2
);_ end of and
(progn
;; Погнали основной код
)
);_ end of if
И будет такой вариант ИМХО более удобным.
Теперь насчет доступа "внутрь" xref'a. Я не понимаю, неужели невозможно через vla-isxref получить - является ли элемент внешней ссылкой или нет? И если да, то выполнять проход по его внутренностям и добавлять в общий результат? Я не зря сказал, что
Цитата
если проходить целиком по внешним ссылкам, не фильтруя их состав, то получить список <...> с учетом внешних ссылок любого уровня вложенности особых проблем не составляет. Для активного (текущего) документа
---
В общем, как я понимаю, основная проблема именно в том, чтобы составить список объектов, так? "Фильтр" выбора (блоки с атрибутами и без и/или дин.блоки с атрибутами и без и/или остальные примитивы, удовлетворяющие каким-то внешним условиям) формируется программно в момент вызова "подсчитывающей" функции.
P.S. Сейчас еще раз скачаю первый VBA-макрос, куда-то я его дел...
Supermax
24.6.2007, 14:39
Ну, теперь начну с mmax-a.
Да, болтовни не просто много, а очень много. Это очень злободневная проблема всех форумов. Я тут уже бодался с некоторыми по поводу «болтовни» в темах, но оказывается тему можно сделать нечитабельной и не только болтовней. Вот она, конкретная примера однако. Те, кто интересуется данной темой, не очень стремятся читать все с нуля, а лезут в самое пекло, в текущую дискуссию, так сказать поразмяться. Даже я сам не очень горю желанием туда лезть и что-нибудь корректировать. Есть много вариантов бороться с этим, например, отредактировать все нафиг так, чтобы материал темы стал похож на художественную книгу, чтобы можно было читать и ржать или плакать. Комментатора что ли завести, как на футбольных матчах? Или еще один вариант, это периодически подводить итоги и «обнулять» исходную точку дискуссии на каждой странице темы. Чтобы далеко не ходить в поисках первоисточника. Но все лень, проклятая лень, вот это все написать не лень, а в два раза меньше для «освежения» понимания происходящего – лень. Но я как-нибудь напрягусь. Обещаю.
Далее: Первый абзац – ну так оно примерно и получится, только на достигнутом останавливаться облом. В Excel уже сбрасывали, и лежа, и стоя, и по диагонали. В Word – аналогично. В Layout любые рамки, включая создание самих Layout-ов потоком. Даже настройка размеров рамки под контур границы печати. Все постигнуто и достигнуто. Осталось только сделать так, чтобы любая прихоть заказчика (про проектировщиков молчу, им лишь бы деньги были) была удовлетворена. Поверь, если ты можешь удовлетворить заказчика, остальных ты можешь удовлетворить пять раз подряд без перерыва.
В ссылки лазить надо. Тебе не надо – не лазь. А мне надо – судьба. Если ссылку открыть отдельным документом – она будет иметь свое пространство. При подсчете элементов в этом пространстве будут созданы новые таблицы, которые надо будет сливать с таблицами других документов. Такое возможно и будет, поскольку не всегда работы объединены в одну модель, но это потом. Сейчас же я заказчику на огромном экране демонстрирую модель здания и отвечаю на его вопросы с помощью его воображения. Оно, это его воображение, очень меня беспокоит. Точнее его отсутствие. И вопросы «А сколько это будет стоить?», «А это за какое время можно сделать?» мне уже сняться.
Если сделать программу, которая может залезть в ссылку, то не лазить туда – вопрос вкуса.
Далее: Да, эта сволочь, покопалась у себя в нутрии и нашла этот файл, но ручку зажгла только одну, ту, которая на самом верхнем уровне. В набор вставить она внутреннюю ссылку не захотела. И мы по прежнему туда залезть не можем. С жопой целиком и полностью с вами согласен. Вот kpblc туда слазил, а впечатлениями делиться не спешит, видать там много интересного и нужного добра лежит. Но я все же туда дорогу отыщу. Я не мазохист по жопам лазить, но все указатели на дороге показывают именно туда.
Вот один из них:
(nentsel "Укажи блок:")
Выдает:
(<Entity name: 7efdda58> (10251.0 -3557.01 0.0) ((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0) (9368.0 -3560.07 0.0)) (<Entity name: 7efd2e40> <Entity name: 7efb5da0> <Entity name: 7efa5078> <Entity name: 7ef9b090> <Entity name: 7ef820a8>))
Вот это:
(<Entity name: 7efd2e40> <Entity name: 7efb5da0> <Entity name: 7efa5078> <Entity name: 7ef9b090> <Entity name: 7ef820a8>)
С лева, на право 1. – имя самого блока; 2. – имя ссылки куда он вставлен; 3. – имя ссылки куда вставлена первая ссылка; 4. – имя ссылки куда вставлена вторая ссылка; 5. – имя ссылки куда вставлена третья ссылка. Последнее имя можно получить выковыряв его из простого набора в текущем пространстве созданного функцией ssget (в смысле, набор создан).
Как эти имена получить без указания на деталь чертежа – вопрос открытый, поиски ответа продолжаются.
Теперь к kpblc:
Мой вариант красившее. И зелененькая, и синенькая, и всего одна строчка. И работает. А у тебя белая, как я и раньше писал с ssget в паре. С (command “_select” “BOX” … такое вытворяет! И ^C^C в конце не помогает выйти из коллапса. Что я, думаешь не пробовал? Да я все почти перепробовал. Остановился на этом варианте, как на наиболее показательном. Вот ее своими проверками на политкорректность и совершенствуй. Красивый лисп, это не только волны по экрану, а еще и маленькое такое зернышко хитрости. Все гениальное не всегда – просто. Но иногда и простота бывает гениальной.
Так, увлекся. Пардон.
Далее:
Колись как пройти целиком по внешним ссылкам. Хрен с ними, их не так уж и много будет, можно и все подряд открывать и этот клочек пространства прочесывать.
Вот мои кады такой функции Lisp-а как vla-isxref не знают. Может у тебя библиотека какая-нибудь подгружена? Вот vla-get-IsXref имеется. Ну я ей и пользуюсь по мере возможности (см. пост №73). Список ссылок, попавших в набор имею, но только в верхний, в текущем пространстве модели сделанный. А мне нужны все имена, причем в привязке вернего уровня (текущего пространства модели), а не взятые при открытии ссылок из пространства _refedit.
КОЛИСЬ!!! Или сделай функцию, которая включает ручки всем ссылкам.
Цитата
Вот мои кады такой функции Lisp-а как vla-isxref не знают.
Ну, знаешь, когда пишешь без запущенного акада, такого класса ошибку легко допустить. Согласен, есть только vla-get-isxref, моя ошибка.
Цитата
Остановился на этом варианте, как на наиболее показательном. Вот ее своими проверками на политкорректность и совершенствуй.
В любой момент пользователь (то бишь я) нажимает Esc - и чего будет в результате? Праально, возврат ошибки. Который надо обрабатывать. Что лично мне делать в ломак. ИМХО гнаться за красивостью на экране в данном случае - излишество. Как бы то ни было - дело твое.
Далее.
Как ты проходишь по всему составу блока? В этом смысле доступ к составу внешней ссылки для активного (текущего) документа ничем не отличается.
Вот и получай: если ent - vla-указатель на вхождение внешней ссылки, то пройтись по ее составу можно так:
Код
(vlax-for subent
(vla-item
(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
(vla-get-name ent)
);_ end of vla-item
;; И здесь все что надо получить - в обработку.
);_ end of vlax-for
Дерзай. Заключай в рекурсивную функцию и соединяй результаты.
Цитата
Или сделай функцию, которая включает ручки всем ссылкам.
На хрена, если и без включения ручек я подобным кодом пройдусь по всем ссылкам, попавшим в набор?
Supermax
24.6.2007, 21:25
(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
И как же это ты совместил? Если не секрет конечно?