Тема: Добавление атрибута и сортировка блоков по имени и по атрибутам

У меня очень сложная задача!!! Помогите пожайлуста решить ее!!!
У меня есть код, который создает блоки с разными именами!!!
У меня есть код, который ищет и сортирует их!!!
К примеру я создаю блоки "Деталь А" и "Деталь Б". Потом ищу их. Код находит их и показывает мне "Деталь А" - 4 штуки, "Деталь Б" - 5 штук. Все это работает замечательно!!! Но этого недостаточно!!!
У каждой детали есть ещё свой номер и самое главное часть из них заземлена, а часть нет!!!
ВОТ ПРИМЕРНАЯ СХЕМА К ЧЕМУ Я ХОЧУ ПРИЙТИ:
НАЗВАНИЕ   КОЛИЧЕСТВО НОМЕРА  ЗАЗЕМЛЕНИЕ
"Деталь А" - 4 штуки    №1,№3    №2,№3
"Деталь Б" - 5 штук     №6,№9    №6,№7
Я думала эту проблему решить через атрибуты.

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Через атрибуты можно конечно, но я не понял, что подразумевается под словом "сортировка"? Скорее тут имеется в виду "фильтрация". То есть должна быть функция, которая возвращает массив   BlockReference - ов,  аргументов у функции два:
1- имя блока
2- значение атрибута блока
Естественно, в код, создающий блоки нужно, добавить кусок, который создает атрибуты блока

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Насчет фильтра Вы правильно поняли.
А как добавить атрибут, чтобы вот, к примеру, в форме два окошечка (TextBox1 и TextBox2) и в них устанавливать атрибуты???
В первом окне номер детали, а во втором заземлена она или нет???

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Дарья
Чтобы твоя поблема была более понятна, опиши,
какие атрибуты в блоке, какие у них тэги и
каким образом заданы значения (например номера)
Ты можешь добавить, например, невидимый атрибут
в описание твоего блока, если это необходимо,
который будет указывать заземление — типа Да/Нет без значения по умолчанию
Возможны другие варианты (см. динамические блоки)
~'J'~

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Вот описание как хотелось бы чтобы работала моя программа:
1 ШАГ - я выбираю название блока ("Деталь А" либо "Деталь Б" и т. д. и т.п.) и вставляю блок в чертеж. ЭТОТ КОД У МЕНЯ ЕСТЬ И РАБОТАЕТ ОН ОТЛИЧНО.
2 ШАГ - я нажимаю кнопку на форме, форма исчезает и в командной строке появляется "Выберите деталь". Я выбираю. Появляется другая форма с двумя окошками. В первом окошке я выбираю номер (№1, №2, №3 и т.д. и т.п.).
Во втором окошке я выбираю заземлена или нет деталь(Да/Нет). Нажимаю на кнопку. Форма исчезает, а из центра блока (Блок в виде круга) появляется выноска с номером (№1, №2....то что я выбрала в первом) и ещё из центра появляется черточка, обозначающая заземление.
ЭТОГО КОДА У МЕНЯ НЕТ.
3 ШАГ - Ну а теперь подсчет деталей. Мой код фильтрует по названию: "Деталь А" - 4 штуки, "Деталь Б" - 5 штук... И результаты выводятся в форму.
А хотелось бы чтобы в автокаде появлялась таблица и в ней результаты подсчета.
ШАПКА таблицы:
Наименование----Штук---Номера
Что касается заземления, то результат бы вывести просто в форму в виде:
"Деталь А" - 4 штуки из них 2 заземлено.
Вот так. Насколько смогла подробно описала программу. Помогите пожайлуста!!!

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Дарья, раз ты смогла программно создавать блоки, значит сможешь добавить к ним программно атрибуты. У меня же просто нет времени приводить тебе исходный код, котрый будет немаленьким. Вся информация есть в помощи

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Мне бы не хотелось Вас напрягать конечно, но для меня эта задача очень трудная... Помогите, если Вам это не слишком затруднительно.

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Дарья
Кстати какая версия Автокада?
Выложи файл с 2 вставленными блоками (с заземлением и без)
и с заданными значениями атрибутов,
что значит выбираешь номера?
Их несколько на каждый блок?
Залей черттеж сюда:
www.webfile.ru
и потом выложи ссылку
~'J'~

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Автокад 2007.
Не получается закачать файл.
Может Вам по электронной почте отправить???

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Я Вам отправила файл на fixo@yandex.ru

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Дарья
Тебе это нужно для работы или курсовой проект?

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Дарья
Во-первых, никто не просил вывешивать мой адрес
Теперь я поимею кучу спама за это

Создай форму UserForm1:
[Button: cmdSelect "Выбрать блок"]                   [Combobox: cbxAttributes]
[Label1: "Новое значение:"]                    [Textbox:  txtNewValue]
[Label2: "Заземлить?"]                    [Combobox: cbxDynProps]
[Button: cmdUpdate "Редактировать этот блок"][Button: cmdUpdateAll "Редактировать все блоки"]
            [Button: cmdExit "Выход"]
Код на форме:

Option Explicit
Dim oSset As AcadSelectionSet
Dim oEnt As AcadEntity
Dim oBlkRef As AcadBlockReference
Dim bname As String
Dim atts As Variant
Dim i As Integer
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdSelect_Click()
Dim varpt
Me.Hide
On Error Resume Next
ThisDrawing.Utility.GetEntity oEnt, varpt, vbCrLf & "Выбрать блок"
If Err Then
MsgBox "Nothing selected"
Exit Sub
End If
If Not TypeOf oEnt Is AcadBlockReference Then
MsgBox "Wrong object selected"
Exit Sub
End If
Set oBlkRef = oEnt
If oBlkRef.IsDynamicBlock Then
bname = oBlkRef.EffectiveName & "," & "`*U*"
Else
bname = oBlkRef.Name
End If
If oBlkRef.HasAttributes Then
Dim oAtt As AcadAttributeReference
atts = oBlkRef.GetAttributes
For i = LBound(atts) To UBound(atts)
Set oAtt = atts(i)
Me.cbxAttributes.AddItem oAtt.TextString
Next
End If
Call GetDinamicProps(oBlkRef, "Земля")
Me.Show
End Sub
Private Sub cmdUpdate_Click()
  If Me.cbxAttributes.Text = "" Then
  MsgBox "You forgot to select" & vbCr & "attribute value in combobox"
  Exit Sub
  End If
  If Me.txtNewValue = "" Then
  MsgBox "You forgot to enter" & vbCr & "new attribute value in textbox"
  Exit Sub
  End If
  If Me.cbxDynProps = "" Then
  MsgBox "You forgot to enter" & vbCr & "dynamic prperty value in combobox"
  Exit Sub
  End If
      For i = LBound(atts) To UBound(atts)
        If atts(i).TextString = cbxAttributes.Text Then
          atts(i).TextString = txtNewValue.Text
        End If
      Next i
  Dim props() As AcadDynamicBlockReferenceProperty
  props = oBlkRef.GetDynamicBlockProperties
  Dim prop As AcadDynamicBlockReferenceProperty
For i = LBound(props) To UBound(props)
Set prop = props(i)
If prop.PropertyName = "Земля" Then
prop.Value = Me.cbxDynProps.Text
End If
Next i
  ThisDrawing.Regen acActiveViewport
  txtNewValue.Text = ""
  cbxAttributes.Clear
  cbxDynProps.Clear
  cmdUpdateAll.Enabled = False
  cmdExit.SetFocus
End Sub
Private Sub cmdUpdateAll_Click()
  On Error GoTo Err_Control
  Dim cnt As Integer
  Call GetBlockInstances(bname)
  If Me.cbxAttributes.Text = "" Then
  MsgBox "You forgot to select" & vbCr & "attribute value in combobox"
  Exit Sub
  End If
  If Me.txtNewValue = "" Then
  MsgBox "You forgot to enter" & vbCr & "new attribute value in textbox"
  Exit Sub
  End If
  If Me.cbxDynProps = "" Then
  MsgBox "You forgot to enter" & vbCr & "dynamic prperty value in combobox"
  Exit Sub
  End If
  For Each oEnt In oSset
  Set oBlkRef = oEnt
  atts = oBlkRef.GetAttributes
      For i = LBound(atts) To UBound(atts)
        If atts(i).TextString = cbxAttributes.Text Then
          atts(i).TextString = txtNewValue.Text
        End If
      Next i
  Dim props() As AcadDynamicBlockReferenceProperty
  props = oBlkRef.GetDynamicBlockProperties
  Dim prop As AcadDynamicBlockReferenceProperty
For i = LBound(props) To UBound(props)
Set prop = props(i)
If prop.PropertyName = "Земля" Then
prop.Value = Me.cbxDynProps.Text
End If
Next i
      cnt = cnt + 1
 Next oEnt
  Me.Caption = "There are " & cnt & " blocks changed"
  ThisDrawing.Regen acActiveViewport
  txtNewValue.Text = ""
  cbxAttributes.Clear
  cbxDynProps.Clear
    cmdUpdate.Enabled = False
  cmdExit.SetFocus
Err_Control:
If Err.Number <> 0 Then
  MsgBox Err.Description
  Err.Clear
  End If
End Sub
Private Sub UserForm_Initialize()
Me.cmdUpdate.Enabled = True
Me.cmdUpdateAll.Enabled = True
Me.cbxAttributes.Clear
End Sub
Sub GetBlockInstances(bname As String)
     Dim ftype(1) As Integer
     Dim fdata(1) As Variant
     Dim dxfCode, dxfValue
          With ThisDrawing.SelectionSets
               While .count > 0
                    .Item(0).Delete
               Wend
          End With
     With ThisDrawing.SelectionSets
          Set oSset = .Add("$Blocks$")
     End With
     ftype(0) = 0: ftype(1) = 2
     fdata(0) = "INSERT": fdata(1) = bname
     dxfCode = ftype: dxfValue = fdata
     oSset.Select acSelectionSetAll, , , dxfCode, dxfValue
End Sub
Sub GetDinamicProps(blkRef As AcadBlockReference, propName As String)
Dim props() As AcadDynamicBlockReferenceProperty
Dim i As Integer
Dim j As Integer
Dim pvalue As Variant
Dim itm As Object
props = blkRef.GetDynamicBlockProperties
Dim prop As AcadDynamicBlockReferenceProperty
For i = LBound(props) To UBound(props)
Set prop = props(i)
If prop.PropertyName = propName Then
pvalue = prop.AllowedValues
For j = 0 To UBound(pvalue)
cbxDynProps.AddItem pvalue(j)
Next j
End If
Next i
End Sub

Модуль1:

Option Explicit
Sub runme()
Dim frm As UserForm1
Set frm = New UserForm1
frm.Show
End Sub

Чертеж с динамическими блоками солью позже
Больше ничего делать не буду

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Дарья
Ссылка на чертеж
http://webfile.ru/1829033

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Извините пожайлуста что я Ваш адрес написала.
Вы не могли бы пожайлуста файл детали2 мне на почту выслать??? Я открываю, а он пишет что файл рисунка испорчен.

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Я запускаю, а мне выдается сообщение:
User-defined type not defined
И выделяется строка:
Dim props() As AcadDynamicBlockReferenceProperty
Я так понимаю ему не нравится что пользовательский тип не идентифицирован (короче пользовательская переменная не объявлена). В чем дело???

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> technosterone
Нет, это не курсовой проект!!! Это хуже!!! Это мне нужно, чтобы создавать и считать великое множество и многообразие деталей на чертеже. За день выматываешься так, что с ног валишься. Вот хочу облегчить жизнь, немного автоматизировать процесс. А то на дворе 21 век, а мы на бумажке да на калькуляторе считаем :)

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> technosterone
ЭТО - МОЯ НИЗКООПЛАЧИВАЕМАЯ РАБОТА!!!
:(

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Дарья
Чертеж выслал
У меня 2008-й, может в этом дело
Попробуй объявить
Dim props() As Object
~'J'~

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Работает.
Скажите пожайлуста, почему программа работает только на чертеже, который Вы прислали???
Я так подозреваю, что в нем заложены динамические блоки.
А нельзя ли "вшить" эти дин. блоки в сам код Вашей программы, чтобы не таскать чертеж???

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Вы не подскажете как подредактировать выноску и как двигать эту выноску и заземление??

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Дарья

> Дарья
Блоки можно скопировать и вставить в рабочий чертеж,
но лучше их создать заново самой и добавить:
- 4 позиции расположения выноски
- 4 или больше позиции расположения заземления
- описание блока (при создании в поле описание
можно добавить "Деталь А" или "Б")
- еще чего по усмотрению
Эту часть тебе надо решить самостоятельно, тут
никакого программирования, см. в Хэлпе как создавать
динамические блоки
Когда создашь и расставишь все блоки,
загрузи рабочий чертеж на www.webfile.ru только
в архивном виде .rar или .zip иначе опять не
загрузишь
Программа по подсчету и экспорту данных в таблицу
готова, но мне нужно проверить на рабочем чертеже,
хотя на том чертеже что я выслал она работает.
Сссылку скину позже
~'J'~

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Дарья
Ссылка на файлы:
http://webfile.ru/1830293
~'J'~

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

Дарья
Раз это твоя работа, то тебе исходный код не нужен. Могу в качестве упражнения для себя сваять тебе прогу согласно всем твоим требованиям. В результате получишь dll - файл, который будет загружаться командой netload, в котором построение блоков будет делаться программно а так же все остальное, включая генерацию таблиц Автокада

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> technosterone
Предложение заманчивое!!!
Вход в исходный код конечно нужен, а иначе как мне кнопочки редактировать???
:)

Re: Добавление атрибута и сортировка блоков по имени и по атрибутам

> Fatty
Никак не получается выставить на тот сайт файл. Я Вам на почту кинула.
В общем сделала я динамический блок. А нельзя ли "вшить" его в программный код чтобы не таскать в каждый чертеж???