Использование блоков и атрибутов и доступ к ним через VBA
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Использование блоков и атрибутов и доступ к ним через VBA

Использование блоков и атрибутов и доступ к ним через VBA

Ответ
Поиск в этой теме
Непрочитано 02.12.2011, 20:13 #1
Использование блоков и атрибутов и доступ к ним через VBA
MaximuS_G
 
Регистрация: 08.11.2011
Сообщений: 30

Итак, посмотрел блоки и атрибуты... Теперь нужны советы)...
Пусть у меня есть изделие - шкаф. У него есть левая и правая стоевая: Высота - 2100, Глубина -600, Ширина - 18, и 5 полок между ними: Длина - 350, Глубина 500, Высота - 18. Мне нужно будет сначала построить это изделие, а потом вывести список этих деталей с атрибутами.
Создал атрибуты: Высота, Глубина, Ширина. Создал блок с название "ЛеваяСтоевая", включил в него куб 1х1х1 и атрибуты. Вставляю блок, указываю масштаб по осям 2100,600,18. Далее у меня система запрашивает значения атрибутов - ввожу их одинаковыми для масштабов по осям. Теперь у меня есть элемент "Левая стоевая" с нужными мне атрибутами. Правильно ли я все сделал?
Далее нужно этот блок вытянуть куда-нибудь с параметрами... сейчас буду смотреть. Подскажите по моим действиям выше. Спасибо!

Вроде бы нашел, как достать свойства блока:

Код:
[Выделить все]
Dim oBkRef As IAcadBlockReference
Dim strAttributes As String
Dim I As Integer
Dim varAttributes As Variant
...
varAttributes = oBkRef.GetAttributes
    For I = LBound(varAttributes) To UBound(varAttributes)
        strAttributes = strAttributes & _
        " Tag: " & varAttributes(I).TagString & _
        " Value: " & varAttributes(I).TextString
    Next
...
Но почему я не могу получить свойство PromptString? Возможно отгадка кроется здесь:
"This string appears when a block containing this attribute is inserted. The default for this string is the TagString property. Entering acAttributeModeConstant for the Mode property disables the prompt. "
Я понимаю эту фразу, но не пойму как преминить к ситуации. Буду также благодарен за помощь!)

Последний раз редактировалось MaximuS_G, 02.12.2011 в 22:57.
Просмотров: 3950
 
Непрочитано 02.12.2011, 22:36
#2
Кулик Алексей aka kpblc
Moderator

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


У каждого BlockReference есть свойства - Xscale, YScale, ZScale. К ним обращаться будет намного более выгодно, чем запрашивать значения атрибутов, которые, кстати, и могут не соответствовать реальным значениям.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.12.2011, 11:54
#3
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от MaximuS_G Посмотреть сообщение
Но почему я не могу получить свойство PromptString?
Его можно получить у AcadAttribute.
А зачем его получать? Завязывать на это свойство логику программы неверно, по-моему. Потому что, это вспомогательное свойство для пользователя, при вводе значения атрибута. Опираться вернее всего на свойство TagString атрибута.
Vildar вне форума  
 
Непрочитано 03.12.2011, 16:16
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от MaximuS_G Посмотреть сообщение
The default for this string is the TagString property. Entering acAttributeModeConstant for the Mode property disables the prompt.
Ну все же написано, или перевести? делай атрибуты с постоянным значением и не парься по поводу PromptString, это строка приглашения когда вставляешь свой блок
gomer вне форума  
 
Автор темы   Непрочитано 07.12.2011, 16:50
#5
MaximuS_G


 
Регистрация: 08.11.2011
Сообщений: 30


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У каждого BlockReference есть свойства - Xscale, YScale, ZScale. К ним обращаться будет намного более выгодно, чем запрашивать значения атрибутов, которые, кстати, и могут не соответствовать реальным значениям.
Спасибо за совет. Наверное Вы правы, Xscale, YScale, ZScale - удобней использовать. Единственное, я вот сейчас думаю, что детали ведь могут размещаться по разному в пространстве.
То есть толщина материала, например ДСП - 18мм, которая меня не интересует, будет попадать то в Xscale, то в YScale или ZScale. Например, вытянув размеры из изделия, я могу получить такое:
Xscale, YScale, ZScale
1. 500 700 18
2. 350 18 440
3. 18 380 500
...
И меня будут интересовать размеры деталей для раскроя: 500х700, 350х440, 380х500. Пока придумал решить эту ситуацию следующим способом - перебирать все 3 размера по каждой детали, и отбрасывать тот размер, где будет 18 мм. Но это не универсальный способ, потому что не все детали имеют толщину 18мм, иногда это 19 мм, стекло - 4 мм. То есть нужно еще вводить дополнительный критерий. Пока думал, что это может быть название материала, в котором будет указана его толщина, например: "18978 ДСП Бук Шоколадный 18мм", то есть я смогу вытянуть толщину из названия. Материалы буду разбрасывать по слоям, или есть лучше вариант?
Вот так я вижу решение.
Буду благодарен за какие-либо еще советы относительно решение озвученной в начале поста ситуации.

Vildar, gomer
Спасибо за помощь. Я наверное не правильно понял, что такое PromptString.
Я думал, что PromptString содержит значение того, что пользователь вводит в поле Prompt при создании атрибута. Насколько я понял, это не так?
MaximuS_G вне форума  
 
Непрочитано 07.12.2011, 17:06
#6
Кулик Алексей aka kpblc
Moderator

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


Как вариант я бы использовал функции наподобие:
Код:
[Выделить все]
Public Function GetMinValue(varValue As Variant) As Variant
Dim item As Variant, res As Variant
  For Each item In varValue
    If IsEmpty(res) Then
      res = item
    Else
      If item < res Then
        res = item
      End If
    End If
  Next item
  GetMinValue = res
End Function
Пример вызова:
Код:
[Выделить все]
Sub test()
Dim ar() As Variant
  ReDim ar(2)
  ar(0) = 0: ar(1) = 5: ar(2) = -16.35
  MsgBox CStr(GetMinValue(ar))
End Sub
Аналогично нарисовать (при необходимости) GetMaxValue. И работать уже с ними.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Использование блоков и атрибутов и доступ к ним через VBA



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли суммировать данные атрибутов от одинаковых блоков? Максим_Александрович AutoCAD 5 14.10.2011 09:31
Доступ к палитре инструментов AutoCAD через объектную модель remlin Программирование 4 14.05.2008 22:14
Измнение через ексель (через макрос в VBA) аттрибутов динамического блока VitaminC Программирование 4 20.10.2007 14:52
VBA. Сканирование блоков basboy Программирование 1 29.04.2005 13:16
Можно ли через VBA динамически двигать объекты? {Smirnoff} Программирование 4 11.12.2003 01:14