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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Распределение блоков по слоям в Autocad при помощи Excel

Распределение блоков по слоям в Autocad при помощи Excel

Ответ
Поиск в этой теме
Непрочитано 15.07.2016, 23:07
Распределение блоков по слоям в Autocad при помощи Excel
99xt1
 
нефтепереработка
 
Мозырь, Республика Беларусь
Регистрация: 17.11.2009
Сообщений: 77

Здравствуйте.

Есть чертеж в котором вставлены обычные (не динамические и без атрибутов) блоки. Каждый блок вставлен всего один раз. Их список можно получить при помощи извлечения данных в виде таблицы (1й столбец - Название блока, 2й столбец - название слоя).

Хочу изменять в Excel название слоя, затем подгружать в автокад. И чтобы блоки в соответствии с таблицей Excel изменяли свои слои.

Возможно такое? Может есть уже решение (поиском не нашел)?
Просмотров: 5811
 
Непрочитано 05.09.2016, 09:00
#21
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,066


99xt1, оптимизация... Тут не оптимизировать нужно, тут весь алгоритм менять нужно, он ужасен O(n^2).
При обработке каждой ячейки, Ваш алгоритм, перебирает ВСЕ объекты чертежа, КАЖДЫЙ РАЗ!!! Перебирает даже обработанные ранее объекты!
Кстати, кто Вам сказал, что все объекты в пространстве модели именно блоки?
__________________
_бложиг
Boxa на форуме  
 
Автор темы   Непрочитано 05.09.2016, 09:04
#22
99xt1

нефтепереработка
 
Регистрация: 17.11.2009
Мозырь, Республика Беларусь
Сообщений: 77


Этот чертеж делал я сам. В пространстве модели есть 2 растра и остальные только блоки.

Это мой первый код. Так что если хотите помочь, то прошу помощи как сделать лучше.
99xt1 вне форума  
 
Непрочитано 05.09.2016, 09:12
#23
trir


 
Регистрация: 18.12.2010
Сообщений: 3,460


Зачем тут Excel?
trir вне форума  
 
Автор темы   Непрочитано 05.09.2016, 09:18
#24
99xt1

нефтепереработка
 
Регистрация: 17.11.2009
Мозырь, Республика Беларусь
Сообщений: 77


Цитата:
Сообщение от trir Посмотреть сообщение
Зачем тут Excel?
Составляю отчет в виде таблицы Excel где указываю сроки закупки оборудования.
Начальство хочет на основании этого отчета, чтобы на плане это оборудование раскашивалось определенными цветами в зависимости от срока поставки.
Каждый период - свой слой с определенным цветом.
Каждая единица оборудования - один блок. Вот и беру данные из Excel о сроке и перемещаю блоки на определенные слои.
99xt1 вне форума  
 
Непрочитано 05.09.2016, 09:26
1 | #25
trir


 
Регистрация: 18.12.2010
Сообщений: 3,460


dotNET+XML
trir вне форума  
 
Автор темы   Непрочитано 05.09.2016, 09:37
#26
99xt1

нефтепереработка
 
Регистрация: 17.11.2009
Мозырь, Республика Беларусь
Сообщений: 77


Цитата:
Сообщение от trir Посмотреть сообщение
Общую логику понял. Но я не программист. А инженер-технолог и свой "недокод" собирал неделю по разным кусочкам дома вечерами. А с вашим боюсь очень долго разбираться буду))
99xt1 вне форума  
 
Непрочитано 05.09.2016, 09:39
1 | #27
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,066


Цитата:
Сообщение от 99xt1 Посмотреть сообщение
Так что если хотите помочь, то прошу помощи как сделать лучше.
Я не очень хорошо помню VBA, но для начала самая простая оптимизация:

Пройтись по модели и собрать блоки в отдельную коллекцию (objectID + BlockName).
Потом проходясь по этой коллекции назначать слой и перемещая из нее уже обработанные блоки в коллекцию (objectID + BlockLayer).
Пройтись по новой коллекции и назначить слои.

Хотя если помнить, что самая затратная по времени операция, это чтение чертежа, то может имеет смысл поменять циклы местами, один раз проходится по объектам чертежа и много раз проходить по таблице значений...
__________________
_бложиг
Boxa на форуме  
 
Непрочитано 05.09.2016, 09:50
1 | #28
trir


 
Регистрация: 18.12.2010
Сообщений: 3,460


Нужен словарь, где key=BlockName; value=LayerName
trir вне форума  
 
Непрочитано 05.09.2016, 10:05
1 | #29
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,066


Цитата:
Сообщение от trir Посмотреть сообщение
Нужен словарь, где key=BlockName; value=LayerName
само собой разумеется, нужно сгруппировать таблицу в екселе по этим двум полям...
__________________
_бложиг
Boxa на форуме  
 
Непрочитано 05.09.2016, 21:20
1 | #30
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 6,992


Цитата:
Сообщение от 99xt1 Посмотреть сообщение
If Err.Description > vbNullString Then
увидел и вздрогнул - чем вам код ошибки не угодил, зачем строки теребить?)

Затем: операция чтения из ячейки экселя - очень медленная. Одной строчкой считываете диапазон Range в переменную variant, и в этой переменной получаете двухмерный массив значений. И работаете дальше с этими значениями, а не с листом.

Следующее: кто за вас будет отключаться от акада в конце процедуры или при ошибке?
Сергей812 вне форума  
 
Автор темы   Непрочитано 06.09.2016, 10:07
#31
99xt1

нефтепереработка
 
Регистрация: 17.11.2009
Мозырь, Республика Беларусь
Сообщений: 77


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
увидел и вздрогнул - чем вам код ошибки не угодил, зачем строки теребить?)

Затем: операция чтения из ячейки экселя - очень медленная. Одной строчкой считываете диапазон Range в переменную variant, и в этой переменной получаете двухмерный массив значений. И работаете дальше с этими значениями, а не с листом.

Следующее: кто за вас будет отключаться от акада в конце процедуры или при ошибке?
Это я просто откуда-то кусок выдрал на подключение к автокаду.
Покажите как правильно, пожалуйста?

Пробовал два варианта подключения к Автокаду. Первый отсюда:
Код:
[Выделить все]
Sub main()
'***********************************
'*** Code From VisibleVisual.com ***
'***********************************
Dim ACAD As Object
Dim NewFile As Object
Dim MyAcadPath As String
Dim bReadOnly As Boolean
 
On Error Resume Next
ACAD = GetObject(, "ACAD.Application")
If (Err.Number <> 0) Then
   Err.Number = 0
    ACAD = CreateObject("autocad.Application")
   If (Err <> 0) Then
      MsgBox "Could Not Load AutoCAD!", vbExclamation, "Message"
      End
        End If
   End If
'If you want to see AutoCAD on screen
 'ACAD.Visible = True
MyAcadPath = "c:\Temp\Drawing2.dwg"
bReadOnly = True
NewFile = ACAD.Documents.Open(MyAcadPath, bReadOnly)
 
If (NewFile Is Nothing) Then
ErrorMessage:
    If NewFile = "False" Then End
    MsgBox ("Could not find the required spreadsheet that should be located at" & vbCr & MyAcadPath & vbCr & "Please rename or relocate the specified file as needed.")
   End
End If
 
 'Close AutoCAD Process
 'ACAD.Quit
 
ACAD = Nothing
NewFile = Nothing
 
End Sub
Очень долго работает. Несколько раз выскакивает окно типа "Excel ожидает пока другая программа что-то там с OLE". И в конце через две-три минуты "Невозможно открыть Автокад"

Второй отсюда, открывает файл очень быстро
Код:
[Выделить все]
Public Graphics As AcadApplication 
Public Sub OpnAcad() 
    Dim AngBracDwg As String 
    Set Graphics = GetObject(, "AutoCAD.Application") 
    If Err.Description > vbNullString Then 
        Err.Clear 
        Set Graphics = CreateObject("AutoCAD.Application") 
    End If 
    AngBracDwg = "c:\dwg\ba1.dwg" 
    Graphics.Documents.Open (AngBracDwg) 
End Sub
99xt1 вне форума  
 
Непрочитано 06.09.2016, 11:58
#32
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 6,992


Цитата:
Сообщение от 99xt1 Посмотреть сообщение
"ACAD.Application"
Цитата:
Сообщение от 99xt1 Посмотреть сообщение
("autocad.Application")
почему разные названия? Подключаетесь к одному объекту

а втором примере, если замените
Код:
[Выделить все]
If Err.Description > vbNullString Then
на
Код:
[Выделить все]
If (Err.Number <> 0) Then
- то скорость не особо измениться (просто всегда стараюсь при выборе операций между строками и числами использовать последние). Но главные тормоза в вашем коде - это в цикле две медленных операции: обращение к ячейкам листа экселя за значениями и обращение к акаду по COM-интерфейсу. Второе - неизбежно (хотя при большем количестве - десятки-сотни тысяч объектов в БД чертежа лучше другой алгоритм применить, как советовали выше). А вот ускорить обращение к ячейкам копированием Range в variant массив - это ускорение на порядок и выше. Ну и если подключились - то должны и отключиться, и освободить переменную Graphics.
Сергей812 вне форума  
 
Непрочитано 10.09.2016, 14:34
#33
Inferi


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


Попробуй подгрузить tmp.slp, команда test. Шапка таблицы должна начинаться в A1. Код без обработчика ошибок и проверок, написан на коленке.
Вложения
Тип файла: lsp tmp.lsp (17.3 Кб, 12 просмотров)
Inferi вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Распределение блоков по слоям в Autocad при помощи Excel

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение размеров в Autocad из Excel zenija2007 AutoCAD 9 18.09.2015 12:53
Замена связей AutoCAD 2012 и Excel seregas AutoCAD 40 20.06.2014 10:12
Autocad Architecture 2011 не воспринимает Excel. Cyprus Вертикальные решения на базе AutoCAD 3 17.05.2010 18:23
Доработка очередной утилиты AutoCAD <-> Excel Lesha Программирование 2 28.02.2010 20:21
AutoCAD 2007. Вставка блоков О_о vaca AutoCAD 3 25.12.2009 15:01