Тема: автоматизация построения электрических схем(excel-autocad)

Привет всем! есть такая задумка большая часть которой уже осуществленна: Имеем форму в excel, от куда берется название блоков(например "шкаф") и их текстовое наполнение(№ шкафа, клема№1, клема2 и т.п.). далее прога обращается к екселю берет название блока, открывает файл DWG из готовой библиотеки и меняет в нем эти текстовые атрибуты блока далее импортирует все это на чертеж.
Проблема: когда вставляешь в чертеж по несколько одинаковых болков, на открытом библиотечном файле текстовые данные меняются, а когда импортируешь в чертеж то вставляет блок с текстом предъидущего блока одного библиотечного файла! видимо прога берет данные из кэша, может быть как то его можно чистить???
я только начинаю програмиировать, так что изложение проблемы может написанно не очень понятно, но буду очблагодарен если кто-нибудь поможет :)

Re: автоматизация построения электрических схем(excel-autocad)

Покажи код как ты это делаешь.

Re: автоматизация построения электрических схем(excel-autocad)

Алехсей пишет:

открывает файл DWG из готовой библиотеки

Это ключевые слова. Нужно вставлять блок, а в нем уже редактировать атрибуты блока.

Re: автоматизация построения электрических схем(excel-autocad)

Александр Ривилис пишет:
Алехсей пишет:

открывает файл DWG из готовой библиотеки

Это ключевые слова. Нужно вставлять блок, а в нем уже редактировать атрибуты блока.

Изначально я так и думал, но ситуация непростая( алгоритм таков:
-открываю библиотечный файл.DWG(в одном файле один блок, созданный вручную)->делаю select листа, он обнаруживает блок и с помошью фильтра я меняю все текстовые элементыэ->экспортирую файл в dxf-> импортирую его в чертеж. В чертеже уже много блоков и чтобы заменить текст в блоке необходимо сделать селект, а в чертеже с множеством элементов несколько некорректно его использовать, поэтому я и меняю текст изначально-в библиотечном файле)

Re: автоматизация построения электрических схем(excel-autocad)

Поясни. В библиотечном файле определен блок (BlockTableRecord), и вставлен в модель как BlockReference.
Этот блок имеет атрибуты ("текстовые элементы").
Дай пример.

Re: автоматизация построения электрических схем(excel-autocad)

Вильдар пишет:

Поясни. В библиотечном файле определен блок (BlockTableRecord), и вставлен в модель как BlockReference.
Этот блок имеет атрибуты ("текстовые элементы").
Дай пример.

вообщем я просто взял элемент, непрограммно сохранил его как блок в файле, ну и добавил в него текстовые элементы "#", которые в дальнейшем необходимо заменять
Я пробую и в автокаде и в его аналоге Zwcad так что не обращайте внимания на некоторые типы переменных, они только первыми буквами отличаются, долго менять :)

Sub ImportZwcadDocument(ByRef MainDoc As ZwcadDocument, ByVal pathFileImport As String, ByVal InsertPoint As ZwcadPoint, ByVal scalefactor As Double, ByRef TextRep() As String)

    Dim libDoc As ZwcadDocument
    Dim i, countDoc As Integer
    Dim OpenDoc As ZwcadDocument
    Dim exportFile As String
    Dim sset As ZwcadSelectionSet
    Dim importFile As String

    On Error GoTo ErrorHandler
    Set libDoc = ZwcadApplication.Documents.Open(pathFileImport) 'открываю тот самый библиотечный файл с заготовленным блоком
    ReplaceMtext libDoc, TextRep 'процедура замены текстовых элементов в блоке
    Set sset = libDoc.SelectionSets.Add("TEST")
    exportFile = Left(pathFileImport, Len(pathFileImport) - 4) 'задаю имя файла из которого экспортирую
    libDoc.Export exportFile, "DXF", sset
    importFile = exportFile + ".DXF"
    MainDoc.Activate 'активирую файл чертежа в который импортирую блок из библиотечного файла
    MainDoc.Import importFile, InsertPoint, scalefactor
    
    libDoc.Close False
    Kill (importFile)
        
    Exit Sub

ErrorHandler:
    MsgBox ("Error import!")
End Sub

Sub ReplaceMtext(ByVal Zcdocument As ZwcadDocument, ByRef TextReplace() As String)
    Dim TypeError As String
    
    On Error GoTo LabelError
    Dim ssetObj As ZwcadSelectionSet
    Dim objMText As ZwcadMText
    
    For Each ssetObj In Zcdocument.SelectionSets
        If ssetObj.Name = "SelectText" Then
           ssetObj.Delete
           Exit For
        End If
    Next
    
    Dim intDXF(3) As Integer
    Dim varVal(3) As Variant
    TypeError = "Error add selection SelectText!"
    Set ssetObj = Zcdocument.SelectionSets.Add("SelectText")
    ssetObj.Clear
    intDXF(0) = -4
    varVal(0) = "<OR"
    intDXF(1) = 0
    varVal(1) = "MTEXT"
    intDXF(2) = 0
    varVal(2) = "TEXT"
    intDXF(3) = -4
    varVal(3) = "OR>"
    
    Dim point1 As New ZwcadPoint
    Dim point2 As New ZwcadPoint
    TypeError = "Error select zcSelectionSetAll"
    ssetObj.Select zcSelectionSetAll, point1, point2, intDXF, varVal
                              
    Dim countItemSet, i As Integer
    countItemSet = ssetObj.Count
      
    i = 0
    For Each objMText In ssetObj
    ' меняем все текстовые элементы которые определил селект
        objMText.TextString = TextReplace(i) 'TextReplace()-ему я присваиваю значения ячеек(excel) с текстом для замены в библиотечном файле
        objMText.Update
        i = i + 1
    Next
    
    Zcdocument.Regen
    ssetObj.Delete
    Exit Sub
LabelError:
    MsgBox (TypeError)
End Sub

думаю другая часть кода не пригодится, ну вот примерно так

(изменено: Вильдар, 27 мая 2010г. 14:05:53)

Re: автоматизация построения электрических схем(excel-autocad)

Значит блок в библиотечном файле это набор примитивов, в том числе текстовых.
При импорте эти объекты отследить проблематично.
Тогда, твой вариант должен работать. Попробовал в акаде, все нормально.
Посмотри внимательно, может у тебя есть ошибки.
Например в этом месте:

Алехсей пишет:

Set sset = libDoc.SelectionSets.Add("TEST")
    exportFile = Left(pathFileImport, Len(pathFileImport) - 4) 'задаю имя файла из которого экспортирую
    libDoc.Export exportFile, "DXF", sset

Новый набор создается, а выбора нет.

Может стоит привести пример, где используется процедура ImportZwcadDocument.

Re: автоматизация построения электрических схем(excel-autocad)

Привет Вильдар!

Новый набор создается, а выбора нет

выбор я делаю на открытом библиотечном файле и на нем он меняет на требуемый текст, но от когда импортирует в чертеж-ставить данные ранне вставленного такого же объекта(

    ssetObj.Select zcSelectionSetAll, point1, point2, intDXF, varVal
  

Может стоит привести пример, где используется процедура ImportZwcadDocument.

ну на ней все просто, перебор ячеек и открытие файла dwg соответствующему названию в ячейке, далее меняю текст

Sub open_dwg()

nLength = Columns(1).CurrentRegion.Rows.Count
If nLength < 1 Then
    MsgBox ("нет данных")
End If
    
Dim s As String
Dim t As String
Dim ZwCAD As ZwcadApplication
Dim frame As ZwcadDocument
Dim frameMSpace As ZwcadModelSpace
Dim libDoc As ZwcadDocument
Dim str As String
Dim ssetObjDoc As ZwcadSelectionSet
Dim mode As ZcSelectionSetType
Dim corner1 As New ZwcadPoint
Dim corner2 As New ZwcadPoint
Dim retObjects As ZwcadSelectionSet
Dim InsertPoint As New ZwcadPoint
Dim scalefactor As Double
Dim blockFlag As Boolean
Dim allItemText() As String
Dim i As Integer
scalefactor = 1
    'Set ZwCAD = CreateObject("ZwCAD.Application")
        Set frame = ZwcadApplication.Documents.Open(ThisWorkbook.Path + "\lib\frame.dwg")
             nCounter = 4
Do While nCounter <= nLength '(1) цикл перебора ячеек где находятся имена библиотечных
        For nCounter = 4 To nLength
        blockFlag = False
        For x = 3 To 9
            s = Cells(nCounter, x)
                t = Cells(nCounter + 1, 3)
    If blockFlag Then' координатное разбиение, для определенного условия когда открывается и импортируются те самые одинаковые элементы из одного библиотечного файла на которых текст ставится из предъидушего импортируемого
        InsertPoint(0) = 0#: InsertPoint(1) = -67.4: InsertPoint(2) = 0#
        Else
        InsertPoint(0) = 0#: InsertPoint(1) = 0#: InsertPoint(2) = 0#
    End If
        
        str = ThisWorkbook.Path + "\lib\" + CStr(s) + ".dwg"
    
If s = "Шкаф РСУ" Then '(4)
    ReDim allItemText(6)
    allItemText(0) = errAttributeOne(CStr(Cells(nCounter, 13)), nCounter, 13)'присваиваю текст из екселя дя замены в блоке библиотечного файла
    allItemText(1) = errAttributeOne(CStr(Cells(nCounter, 11)), nCounter, 11)
    allItemText(2) = errAttributeOne(CStr(Cells(nCounter, 12)), nCounter, 12)
    allItemText(3) = errAttributeOne(CStr(Cells(nCounter, 10)), nCounter, 10)
    allItemText(4) = errAttributeOne(CStr(Cells(nCounter, 15)), nCounter, 15)
    allItemText(5) = errAttributeOne(CStr(Cells(nCounter, 16)), nCounter, 16)
    allItemText(6) = errAttributeOne(CStr(Cells(nCounter, 17)), nCounter, 17)

    ImportZwcadDocument frame, str, InsertPoint, scalefactor, allItemText

ElseIf s = "Датчик" Then
    allItemText(0) = errAttributeOne(CStr(Cells(nCounter, 19)), nCounter, 19)

    ImportZwcadDocument frame, str, InsertPoint, scalefactor, allItemText
    ' ну и так далее по следующим элементам    
End If '(4)

Next x
Next nCounter

Loop '(1)
'frame.SaveAs (ThisWorkbook.Path + "\dwg.dwg")
'ZwCAD.Quit
'Set ZwCAD = Nothing
End Sub

и все таки мне кажется что просто блок остается в кэш и далее при запросе опять этого же libdoc он тянет данные из него, ведь когда в очередной раз на libdoc меняешь текст то все меняется, а при импорте ставит старое...мда(

Re: автоматизация построения электрических схем(excel-autocad)

Ты ZwCad запускаешь в скрытом режиме. Поэтому, может нужно выполнять реген перед импортом.

Re: автоматизация построения электрических схем(excel-autocad)

Вильдар пишет:

Ты ZwCad запускаешь в скрытом режиме. Поэтому, может нужно выполнять реген перед импортом.

  :) нет это все делаю,уже голову сломал чтоже тут нада та... :?:

Re: автоматизация построения электрических схем(excel-autocad)

чувствуется что проблема решаема, да и где то вот тут рядом..

Re: автоматизация построения электрических схем(excel-autocad)

Еще раз про выбор.

Алехсей пишет:

выбор я делаю на открытом библиотечном файле и на нем он меняет на требуемый текст, но от когда импортирует в чертеж-ставить данные ранне вставленного такого же объекта(

В процедуре ReplaceMtext ты выбираешь и изменяешь все тексты.
А в ImportZwcadDocument ты создаешь набор "TEST", а выбор где?

Re: автоматизация построения электрических схем(excel-autocad)

Вильдар пишет:

Еще раз про выбор.

Алехсей пишет:

выбор я делаю на открытом библиотечном файле и на нем он меняет на требуемый текст, но от когда импортирует в чертеж-ставить данные ранне вставленного такого же объекта(

В процедуре ReplaceMtext ты выбираешь и изменяешь все тексты.
А в ImportZwcadDocument ты создаешь набор "TEST", а выбор где?

тут он не нужен, выбор делается для экспорта в  dxf, вот пример я брал из хелпа

' Create an empty selection set
    Dim sset As ZwcadSelectionSet
    Set sset = ThisDocument.SelectionSets.Add("TEST")
    
    ' Export the current drawing to the file specified above.
    Dim exportFile As String
    exportFile = "C:\test"
    ThisDocument.Export exportFile, "DXF", sset

Вильдар, тут скорее всего нада что то с КЭШ делать либо Zwcadовский очередной бзик, а их много (китайцы, че сказать :) )

Re: автоматизация построения электрических схем(excel-autocad)

Да правда, можно без выбора экспортировать.
Про кэш ничего не знаю.

Re: автоматизация построения электрических схем(excel-autocad)

ну вот казалось бы на такой мелочи и вся работа стоит :evil: ну чтоже невозможного нет, буду надеятся и предпринимать :)