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

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

VBA 2010 медленно работает цикл по сравнению с 2008

Ответ
Поиск в этой теме
Непрочитано 09.08.2011, 10:32 #1
VBA 2010 медленно работает цикл по сравнению с 2008
sergtranes
 
проектирование "чистых комнат"
 
Хайфа
Регистрация: 07.02.2011
Сообщений: 51

возможно кто-нибудь из спецов уже встречался с етой проблемой ?

цикл (9121 повторов)

Код:
[Выделить все]
       
        TEMPI = 0
        
        '-----Blocks-----------------------------
            For Each objBlock In objSelSet3
              TEMPI = TEMPI + 1
            Next objBlock
            MsgBox "TEMPI = " & TEMPI
в 2008 работает 1 сек --- в 2010 работает 10 сек
если я в етот цикл вставлю неоходимые действия, то время выполнениния будет ---
2008 == 5 сек (нормально)
2010 == 1м45сек (ужас)

помогите!
спасибо
Просмотров: 6696
 
Непрочитано 09.08.2011, 10:37
#2
Кулик Алексей aka kpblc
Moderator

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


Разрядность AutoCAD и ОС?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.08.2011, 10:42
#3
sergtranes

проектирование "чистых комнат"
 
Регистрация: 07.02.2011
Хайфа
Сообщений: 51


OC -- 64
AutoCAD 2010 MEP --- 64

Последний раз редактировалось sergtranes, 09.08.2011 в 10:52. Причина: disk
sergtranes вне форума  
 
Непрочитано 09.08.2011, 10:52
#4
Кулик Алексей aka kpblc
Moderator

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


VBA был и будет только 32-разрядным. Так что либо мириться, либо переходить на .NET... ИМХО, как всегда
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.08.2011, 11:06
#5
sergtranes

проектирование "чистых комнат"
 
Регистрация: 07.02.2011
Хайфа
Сообщений: 51


но при установке VBA можно выбрать ( и я выбрал ) 64 !
http://usa.autodesk.com/adsk/servlet...linkID=9240618
sergtranes вне форума  
 
Непрочитано 09.08.2011, 11:20
#6
Кулик Алексей aka kpblc
Moderator

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


Сам язык все равно работает как 32-разрядный, это, по-моему, только загрузчик для 64-битной версии AutoCAD.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.08.2011, 11:34
#7
sergtranes

проектирование "чистых комнат"
 
Регистрация: 07.02.2011
Хайфа
Сообщений: 51


очень жаль если вы правы!
значит надо сократить выборку.
интересно есть ли возможность на стадии создания SelectionSet выбрать только блоки из незакрытых и незамороженных слоев?
сейчас я делаю так:
Код:
[Выделить все]
    intType(0) = 0
    varData(0) = "INSERT" 'blocks ---------
    objSelSet3.Select acSelectionSetAll, filtertype:=intType, _
            filterdata:=varData
sergtranes вне форума  
 
Непрочитано 09.08.2011, 11:44
#8
Кулик Алексей aka kpblc
Moderator

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


В лиспе-то это делается вполне спокойно ключами ssget, а вот в VBA... Увы, не знаю
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.08.2011, 12:09
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Попробуй использовать в filtertype и filterdata логические ключи:
Код:
[Выделить все]
filtertype filterdata
-4          "<OR"
8          "первый 'правильный' слой"
8          "второй"
...
-4        "OR>"
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.08.2011, 12:10
#10
sergtranes

проектирование "чистых комнат"
 
Регистрация: 07.02.2011
Хайфа
Сообщений: 51


а можно создать SelectionSet в Lispe , потом передать его в VBA (ведь ето обьект Автокада)?
т.е. из VBA вызвать Lisp модуль?
дело в том что внутри цикла (см. вопрос) идет запись в Excel.
sergtranes вне форума  
 
Непрочитано 09.08.2011, 12:12
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от sergtranes Посмотреть сообщение
дело в том что внутри цикла (см. вопрос) идет запись в Excel
Ну здрастье приехали - а случаем в одно обращение в эксель не записать (или там на разные листы?)
p.s. можно и все в лиспе сделать
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.08.2011, 12:14
#12
sergtranes

проектирование "чистых комнат"
 
Регистрация: 07.02.2011
Хайфа
Сообщений: 51


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Попробуй использовать в filtertype и filterdata логические ключи:
Код:
[Выделить все]
filtertype filterdata
-4          "<OR"
8          "первый 'правильный' слой"
8          "второй"
...
-4        "OR>"
извените, я не понял.
sergtranes вне форума  
 
Непрочитано 09.08.2011, 12:29
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


У тебя в filtertype и filterdata передаються 2 массива один с dxf кодами другой с их значением - которые отфильтровываются от остальных. В лисп у ssget есть логические группы or, and и прочие, в общем заполни массивы по образцу только вместо строк введи имена всех слоев которые нужны, если проще сделать слои которые НЕ нужны то первой и полседней строкой в примере добавь соответственно -4 "<NOT", -4 "NOT>".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 09.08.2011, 12:40
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от sergtranes Посмотреть сообщение
интересно есть ли возможность на стадии создания SelectionSet выбрать только блоки из незакрытых и незамороженных слоев?
Есть, но тогда в фильтр тебе нужно добавить все эти слои, а для этой цели нужно по ним (по слоям) по всем пройтись.
P.S.: Опоздал. Всё уже объяснили.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 09.08.2011, 13:58
#15
sergtranes

проектирование "чистых комнат"
 
Регистрация: 07.02.2011
Хайфа
Сообщений: 51


Дима, если я правилно понял :
Код:
[Выделить все]
    intType(0) = 0
    varData(0) = "INSERT" 'blocks ---------
    intType(1) = -4
    varData(1) = "<NOT"
    intType(2) = 8
    varData(2) = "lay1" 'layer name--------
    intType(3) = 8
    varData(3) = "lay2" 'layer name--------
    intType(4) = -4
    varData(4) = "NOT>"
    objSelSet3.Select acSelectionSetAll, filtertype:=intType, _
            filterdata:=varData
так?
sergtranes вне форума  
 
Непрочитано 09.08.2011, 14:21
#16
Кулик Алексей aka kpblc
Moderator

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


А чего имена слоев не перечисляете через запятую?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.08.2011, 14:33
#17
sergtranes

проектирование "чистых комнат"
 
Регистрация: 07.02.2011
Хайфа
Сообщений: 51


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А чего имена слоев не перечисляете через запятую?
1. как ? начиная со индекса 2 ?
2. в цикле по слоям придется добавлять в список по одному.
sergtranes вне форума  
 
Непрочитано 09.08.2011, 14:44
#18
Кулик Алексей aka kpblc
Moderator

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


Как вариант (с VBA черт-те сколько не работал):
Код:
[Выделить все]
Option Explicit

Public Sub test()
Dim ss As AcadSelectionSet, ssName As String
Dim sLayer As String, oLayer As AcadLayer
  ssName = "dwgru"
  On Error Resume Next
  ThisDrawing.SelectionSets.Item(ssName).Delete
  For Each oLayer In ThisDrawing.Layers
    If oLayer.Lock = False And oLayer.LayerOn = True And oLayer.Freeze = False Then
      If sLayer = "" Then
        sLayer = oLayer.Name
      Else
        sLayer = sLayer + "," + oLayer.Name
    End If
  Next oLayer
Dim intType(1) As Integer, varData(1) As Variant
  intType(0) = 0: varData(0) = "INSERT"
  intType(1) = 8: varData(1) = sLayer
  Set ss = ThisDrawing.SelectionSets.Add(ssName)
  ss.Select acSelectionSetAll, filtertype:=intType, filterdata:=varData
End Sub
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.08.2011, 15:25
#19
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Кулик Алексей aka kpblc, по-моему один End If пропустил, а так все работает
Код:
[Выделить все]
Option Explicit

Public Sub test()
Dim ss As AcadSelectionSet, ssName As String
Dim sLayer As String, oLayer As AcadLayer
  ssName = "dwgru"
  On Error Resume Next
  ThisDrawing.SelectionSets.Item(ssName).Delete
  For Each oLayer In ThisDrawing.Layers
    If oLayer.Lock = False And oLayer.LayerOn = True And oLayer.Freeze = False Then
      If sLayer = "" Then
        sLayer = oLayer.Name
      Else
        sLayer = sLayer + "," + oLayer.Name
      End If ' вот тут
    End If
  Next oLayer
Dim intType(1) As Integer, varData(1) As Variant
  intType(0) = 0: varData(0) = "INSERT"
  intType(1) = 8: varData(1) = sLayer
  Set ss = ThisDrawing.SelectionSets.Add(ssName)
  ss.Select acSelectionSetAll, filtertype:=intType, filterdata:=varData
End Sub
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 09.08.2011, 15:41
#20
Кулик Алексей aka kpblc
Moderator

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


Каюсь, пропустил...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA 2010 медленно работает цикл по сравнению с 2008



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoCAD 2010 rus. Некорректно работает команда 3DСОРБИТА (свободная орбита). Lestnic-master) AutoCAD 17 27.08.2012 13:33
Акад 2008 неустойчиво работает (зависает периодически). Как определить причину зависания (лог ошибок, конфликты) Baldares AutoCAD 13 19.03.2009 10:22
doPDF конвертер в PDF - медленно работает Pilot Прочее. Программное обеспечение 8 21.03.2008 13:45
VBA для AutoCAD2005 не работает PlotToDevice Garrick Программирование 1 17.02.2006 17:30