Тема: Определение "подсказки" атрибута выбранного блока?
Привет,
Быстрее чем через коллекцию блоков, ее можно узнать?
Может как-нибудь через dxf?
Спасибо,
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Определение "подсказки" атрибута выбранного блока?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Привет,
Быстрее чем через коллекцию блоков, ее можно узнать?
Может как-нибудь через dxf?
Спасибо,
Попробуй свойство атрибута TagString
Фигня такая, в блоках (ж.б. изделия панелей) по пять атрибутов: Марка, Наименование, Обозначение, Масса и Материал и их можно получить только по подсказке (promt), а во всех Tag'ах - имя блока.
Так вот, лазить за "подсказкой" через коллекцию блоков не совсем "безопасно", ведь атрибуты в BlockReferenc'е и в Blocks могут отличаться (например если кто-нибудь в редакторе блоков удалит атрибут). Надо это как-то проверять.
Ну а про dxf я кажись загнул. Ведь нет такой возможности?
Был бы лисп, я б попробовал. А в VBA - я лох
Для VBA, через таг:
Function GetAttributePointerByTagString(oBlock As AcadBlockReference, sTag As String) As AcadAttributeReference Dim arAttr() As AcadAttributeReference, lCounter As Long If oBlock.HasAttributes Then arAttr = oBlock.GetAttributes Dim AttrCounter As AcadAttributeReference For lCounter = 0 To UBound(arAttr) If UCase(arAttr(lCounter).TagString) = UCase(sTag) Then Set GetAttributePointerByTagString = arAttr(lCounter) Exit For End If Next End If End Function Sub test() Dim retObject As AcadEntity, sReqTag As String, sAvailTag As String Dim retAttr As AcadAttributeReference, lCounter As Long, arAttr() As AcadAttributeReference On Error GoTo lErrorGetEnt ThisDrawing.Utility.GetEntity retObject, retPoint If retObject.ObjectName = "AcDbBlockReference" And retObject.HasAttributes Then arAttr = retObject.GetAttributes For lCounter = 0 To UBound(arAttr) If sAvailTag = "" Then sAvailTag = arAttr(lCounter).TagString Else sAvailTag = sAvailTag & "\" & arAttr(lCounter).TagString End If Next lCounter sReqTag = ThisDrawing.Utility.GetString(True, "Укажите нужный таг [" & sAvailTag & "]") Dim Res As AcadAttributeReference Set Res = GetAttributePointerByTagString(retObject, sReqTag) MsgBox "Значение атрибута : " & Res.TextString End If Exit Sub lErrorGetEnt: MsgBox "Ошибка указания примитива!", vbOKOnly + vbCritical + vbApplicationModal, "Ошибка указания" Exit Sub End Sub
Как вариант, конечно.
А я и тама и тама лох ))) но хоцца ускорить работу
Ты наверно не понял всей бредовости ситуации: имеем блок с 5 атрибутами и у всех Tag = имени этого блока!!! поделать с этим я ничего не могу((
по твоему примеру у меня sAvailTag=
Ладно, буду и дальше выкручиватся через коллекцию блоков (значения атрибутов и там(Blocks) и там(BlockReference) у нас равны, вот такая вот фигня:))
Ой, недописал:
sAvailTag="ЦВ1\ЦВ1\ЦВ1\ЦВ1\ЦВ1"
> Vildar
Ситуация, при которой в блоке несколько атрибутов с одинаковыми тэгами, по меньшей мере неверна. По хорошему от этого надо избавляться любой ценой. Ну, не знаю... переименуй атрибуты в описании блока, потом попробуй _attsync провернуть.
Такой принцип блоков ввел внештатный программер.
Он писал приложение на лиспе. все в fas'ах. позырить не могу. Ему наверно просто определять Promt'ы.
А, еще забыл, каждый атрибут на своем слое (Atr_Мarka, Atr_Naimenovanie и т.д.) Щас попробую это использовать.
> Vildar
Дурилка картонная твой программер. Если он нештатный - то почему, получив оплату, он не предоставил исходные коды? Ведь по идее заказчиками работы являешься ты (ну или контора, неважно). Соответственно права на интеллектуальную собственность (насколько я понимаю) должны принадлежать явно не программеру.
P.S. лично я бы попробовать переписать код, если бы подобная задача передо мной встала.
Переписать код будет даже маловато.
Уже созданы библиотеки блоков.
Нужна была бы еще програмка по редактированию всех этих блоков.
Вносить коренные изменения в ход работы, при котором прежняя система не сможет работать, мне не позволят. Я тут неск. месяцев работаю, а он неск. лет (крепкие связи). Да и я на самом деле смытся уже подумываю.
А скажи, как бы ты сделал такие блоки, ну у которых значения атрибутов жестко заданы.
Тип атрибута - "постоянный" (на рус акаде), не подходит, т.к. его не видно на чертеже.
А может быть вообще не атрибутами.
Только надо чтобы эти свойства (марка, итд и их значения) были видны при выделении блока, а марка должна быть отображена и на чертеже (ну тут тока атрибутом наверное)
Спасибо,
Интересная фигня... Может, так:
... dim ... ThisDrawing.Utility.GetEntity objBlk, varPoint, "Выберите вставку блока" If TypeOf objBlk Is AcadBlockReference Then For Each obj In objBlk.GetAttributes Select Case obj.layer Case "Atr_Мarka" Marka=obj.textstring Case "Atr_Naimenovanie" Naimenovanie=obj.textstring .... end select Next
Если, конечно, я правильно понял и в promt задано наименование атрибута ("Марка, Наименование, Обозначение, Масса и Материал"), а значение в textstring. Если же в promt - именно значение атрибута, то ... странная логика у вашего программиста.
> AlexV
все правильно, спасибо
надо будет еще проверок напихать этих слоев для атрибутов, соответствия с promt'ами, ну и тд.
Но если кто знает или узнает простой способ получения promt'а для атрибута выбранного блока - пишите, было бы круто.
> Vildar
Но если кто знает или узнает простой способ получения promt'а для атрибута выбранного блока — пишите, было бы круто.
В VBA никак не определишь, не трать силы и время.
Я так понимаю, PromptString- свойство объекта AcadAttribute (описание атрибута в описании блока). А у объекта AcadAttributeReference, т.е атрибута, входящего в состав вставленного в чертеж блока, такого с-ва я чего-то не наблюдаю. Ну, поскольку атрибуты гарантированно разнесены на разные слои, то вполне можно это использовать. Можно, в принципе, написать простой код, перебирающий все описания блоков, и меняющий значения TagString атрибутов в зависимости от слоя, на котором они расположены.
А может быть вообще не атрибутами.
Только надо чтобы эти свойства (марка, итд и их значения) были видны при выделении блока, а марка должна быть отображена и на чертеже (ну тут тока атрибутом наверное)
Можно использовать расширенные данные (Xdata), если свойства должны считываться с вставки блока программно (при подсчете спецификации, напр.). Если же их необходимо видеть просто при выделении блока, можно использовать гиперссылку (навел курсор на блок - появилась информация по нему)
Наверно атрибутами попрощее будет,
да и люди уже привыкли.
Ладно, всем спасибо, все свободны :)))
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Определение "подсказки" атрибута выбранного блока?
Форум работает на PunBB, при поддержке Informer Technologies, Inc