Autocad vba не установлен вызовите программу установки
Перейти к содержимому

Autocad vba не установлен вызовите программу установки

  • автор:

Autocad 2017 не запускается VBA

Добрый день!
Столкнулся с такой проблемой при установки AUTOCAD 2016 и 2017.
Скачал с оф.сайта «AutoCAD_2017_VBA_module_Win_64bit_dlm.sfx», установил, везде показывает что VBA Enabler установлен, но при запуске «Запустить Макрос VBA» пишет сообщения и не хочет ничего запускать.

Кто нибудь сталкивался с подобной проблемой, 4 часа сегодня потратил на все установки и переустановки, ничего не помогает =\ подскажите пожалуйста.

Просмотров: 12027

LISP, C# (ACAD 200[9,12,13,14])

Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,810
Доступа на Яндекс.Диск нет. К посту не приложить ничего, что ли?

__________________
Моя библиотека lisp-функций

Обращение ко мне — на «ты».
Все, что сказано — личное мнение.

Кулик Алексей aka kpblc
Посмотреть профиль
Посетить домашнюю страницу Кулик Алексей aka kpblc
Найти ещё сообщения от Кулик Алексей aka kpblc

Автозагрузка и выполнение процедур AutoLISP

Загрузите процедуры AutoLISP при запуске программы и выполняйте команды или функции во время работы с чертежом.

Программы на основе AutoCAD автоматически загружают содержимое трех определяемых пользователем файлов, acad.lsp, acaddoc.lsp и файла MNL, связанных с текущим файлом адаптации.

По умолчанию загрузка файла acad.lsp производится один раз в начале нового сеанса программы, в то время как загрузка файла acaddoc.lsp производится для каждого документа (или чертежа). Это позволяет связать загрузку файла acad.lsp с запуском приложения, а загрузку файла acaddoc.lsp с открытием документа (или чертежа). Описанный способ загрузки можно изменить, модифицировав значение системной переменной ACADLSPASDOC.

Если в одном из этих файлов определена специальная функция S::STARTUP , она автоматически исполняется сразу же после инициализации чертежа. Кроме того, перечень приложений для автоматической загрузки можно выбрать с помощью параметра ЗАГПРИЛ. В последнем случае редактирование файлов не требуется.

Файлы автозагрузки acad.lsp и acaddoc.lsp не поставляются с программными продуктами на основе AutoCAD. При необходимости пользователь должен создать их самостоятельно.

Прим.: Начиная с продуктов на базе AutoCAD 2014, пользовательские приложения должны работать в безопасном режиме; в этом случае системной переменной SECURELOAD установлено значение 1 или 2. В безопасном режиме работа программы будет ограничена загрузкой и выполнением файлов, содержащих код из доверенных источников. Пути к доверенным источникам определяются системной переменной TRUSTEDPATHS.

Автозагрузчик команд

При загрузке файла AutoLISP определения команд в файле занимают определенный объем памяти даже в том случае, если команды не используются. Функция autoload языка AutoLISP позволяет сделать команду доступной без загрузки ее кода в память. Добавление следующих выражений в файл acaddoc.lsp вызывает автоматическую загрузку команд КОМАНДА1, КОМАНДА2 и КОМАНДА3 из файла cmds.lsp и команды НОВАЯКОМ из файла newcmd.lsp.

(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) (autoload "NEWCMD" '("NEWCMD"))

При первом вводе в командной строке имени автоматически загруженной команды AutoLISP загружает полное определение этой команды из соответствующего файла. В AutoLISP также имеется функция autoarxload для приложений ObjectARX.

Прим.: Если существует несколько файлов автозагрузки AutoLISP с одинаковыми именами, загружается тот из них, который имеет наиболее поздний штемпель даты и времени. То же самое происходит при загрузке файлов с расширениями LSP, если не указано полное имя файла (с расширением).

Файл ACAD.LSP

Пользователь может создать файл acad.lsp для регулярного использования программ на AutoLISP. При запуске AutoCAD производится поиск файла поддержки acad.lsp. Если файл acad.lsp найден, он загружается в память.

Это связано с тем, что файл acad.lsp предназначен для автозагрузки специальных приложений. Поэтому все переменные и функции, определенные в файле acad.lsp, доступны только для самого первого чертежа. Если требуется, чтобы некоторые процедуры были доступны для всех открываемых документов, их следует поместить в файл acaddoc.lsp.

Режимом загрузки файлов acad.lsp и acaddoc.lsp можно управлять с помощью системной переменной ACADLSPASDOC. Если для системной переменной ACADLSPASDOC задано значение 0 (значение по умолчанию), файл acad.lsp загружается только один раз: при запуске приложения. Если она равна 1, файл acad.lsp загружается при создании нового чертежа или открытии существующего файла чертежа.

В файле acad.lsp может размещаться код AutoLISP одной или нескольких процедур или только последовательность вызовов функции load . Последний способ более предпочтителен, так как при этом упрощается возможная модификация перечня загружаемых процедур и приложений. Если следующий код сохранить как файл acad.lsp, файлы mysessionapp1.lsp, databasesynch.lsp и drawingmanager.lsp будут загружаться при каждом запуске программы.

(load "mysessionapp1") (load "databasesynch") (load "drawingmanager")

Прим.: Не изменяйте зарезервированный файл acad.lsp. В программе Autodesk имеется файл acad.lsp, который содержит функции на языке AutoLISP, описанные специально для этой версии. Данный файл загружается в память непосредственно перед загрузкой файла acad.lsp. обозначает версию программы на основе AutoCAD. Например, acad2022.lsp является файлом, загруженным программами на основе AutoCAD 2022 .

Файл ACADDOC.LSP

Файл acaddoc.lsp предназначен для выполнения инициализации каждого документа (чертежа). Этот файл удобно использовать для автоматической загрузки библиотек AutoLISP-процедур при создании нового чертежа или открытии имеющегося.

Каждый раз при открытии чертежа программа AutoCAD производит поиск файла acaddoc.lsp по библиотечному пути. При обнаружении такого файла производится его загрузка в память. Файл acaddoc.lsp всегда загружается вместе с каждым чертежом независимо от значения ACADLSPASDOC.

В большинстве случаев пользователю достаточно иметь один файл acaddoc.lsp для всех AutoLISP-процедур, работающих непосредственно с документами. Программа выполняет поиск файла acaddoc.lsp в порядке, заданном в стандартных библиотечных путях. Поэтому при работе с различными типами чертежей в каждой папке с чертежами можно хранить свой файл acaddoc.lsp для загрузки требуемого набора процедур AutoLISP.

В файле acaddoc.lsp может храниться код для одной или нескольких процедур или серии запросов функции load . Последний способ более предпочтителен, так как при этом упрощается возможная модификация перечня загружаемых процедур и приложений. Если приведенный ниже код сохранить как файл acaddoc.lsp, файлы mydocumentapp1.lsp, build.lspи counter.lsp будут загружаться каждый раз при открытии нового документа.

(load "mydocumentapp1") (load "build") (load "counter")

Прим.: Не изменяйте зарезервированный файл acaddoc.lsp. В программе Autodesk имеется файл acaddoc.lsp, который содержит функции на языке AutoLISP, написанные специально для этой версии. Данный файл загружается в память непосредственно перед загрузкой файла acaddoc.lsp. Параметр обозначает версию программы на основе AutoCAD. Например, acaddoc2022.lsp является файлом, загруженным программами на основе AutoCAD 2022 .

Адаптация файлов MNL и меню AutoLISP

Во время загрузки файла адаптации (CUI/CUIx) программа выполняет поиск файла MNL с таким же именем. При обнаружении нужного файла производится его загрузка в память. Данный механизм позволяет обеспечить загрузку функций AutoLISP, необходимых для работы элементов интерфейса пользователя.

Например, файл адаптации acad.cuix выполняет поиск файла acad.mnl, который может определить различные функции AutoLISP, используемые элементами пользовательского интерфейса в файле адаптации. MNL-файл загружается после файла acaddoc.lsp.

Прим.: Если файл адаптации загружается с помощью функции command на языке AutoLISP, которая имеет формат (command «меню» «новое меню») , то соответствующий файл MNL загружается только после запуска всей процедуры AutoLISP.

(command "menu" "newmenu") (princ "Newmenu utilities… Loaded.") (Princ)

В данном примере для выдачи сообщения использована функция princ . При первом обращении к функции princ в командной строке отображается следующий текст:

Утилиты «новое меню»… загружены.

Второй вызов princ используется для завершения функции AutoLISP. Без второго вызова princ сообщение в командной строке появится дважды. Как уже упоминалось ранее, можно использовать аргумент при_ошибке при вызове функции load для повышения надежности процедур.

Функция S::STARTUP: выполнение после завершения инициализации чертежа

Для выполнения операций по настройке после инициализации чертежа можно написать функцию S::STARTUP.

Все автоматически загружаемые файлы LISP (acad.lsp, acaddoc.lsp и MNL) размещаются в памяти до завершения полной инициализации чертежа. Обычно это не создает проблем, за исключением тех случаев, когда используется функция command ; надежная работоспособность данной функции возможна только после завершения инициализации чертежа.

Если функция S::STARTUP , определенная пользователем, содержится в файлах acad.lsp, acaddoc.lsp или MNL, то она выполняется при каждом создании нового чертежа или открытии имеющегося. Таким образом, для выполнения операций по настройке можно создать функцию S::STARTUP и поместить ее в автоматически загружаемый файл AutoLISP.

Пусть, например, требуется переопределить стандартную команду ШТРИХ таким образом, чтобы при вводе ее имени вызывалась команда КШТРИХ и выдавалось соответствующее сообщение. Для этого в файл acaddoc.lsp нужно добавить следующий код:

(defun C:HATCH ( ) (alert "Using the BHATCH command!") (princ "\nEnter OLDHATCH to get to real HATCH command.\n") (command "BHATCH") (princ) ) (defun C:OLDHATCH ( ) (command ".HATCH") (princ) ) (defun-q S::STARTUP ( ) (command "undefine" "hatch") (princ "\nRedefined HATCH to BHATCH!\n") )

Перед завершением инициализации чертежа с помощью функции defun задаются новые описания команд ШТРИХ и ВСТРШТРИХ. После завершения инициализации чертежа вызывается функция S::STARTUP , которая отключает стандартное описание команды ШТРИХ.

Прим.: Для того чтобы функция S::STARTUP не переопределяла функции с таким же именем из других файлов, ее следует определить с помощью функции defun-q , а не defun .

Так как функция с именем S::STARTUP может быть определена в различных файлах (acad.lsp, acaddoc.lsp, файлах MNL или любых других файлах AutoLISP), то определенную ранее функцию S::STARTUP можно переопределить.

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

(defun-q MYSTARTUP ( )

. автоматически выполняемая функция .

) (setq S::STARTUP (append S::STARTUP MYSTARTUP))

В результате такого определения код предыдущей загруженной функции S::STARTUP добавляется к коду новой функции S::STARTUP . Этот способ определения можно использовать независимо от ранее существовавшей функции S::STARTUP .

На уровень выше: Приложения AutoLISP

Понятия, связанные с данным
  • Приложения AutoLISP
  • Загрузка приложений AutoLISP
  • Предотвращение ошибок AutoLISP при выполнении файлов автозагрузки
  • Установка и удаление приложений подключаемого модуля
  • Поддерживаемые интерфейсы программирования

Autocad vba не установлен вызовите программу установки

Коллекция Documents и объект Document обеспечивают доступ к файловым функциям.
Для этого следует использовать один из методов Add, Close, Save, SaveAs, Import, Export. Пример открытия рисунка:

Sub OpenDrawing() Dim dwgName As String dwgName = "c:\Program Files\acad2002\sample\campus.dwg" If Dir(dwgName) <> "" Then ThisDrawing.Application.Documents.Open dwgName Else MsgBox "Файл " & dwgName & " не существует." End If End Sub

Пример создания рисунка

Sub NewDrawing() Dim docObj As AcadDocument Set docObj = ThisDrawing.Application.Documents.Add End Sub

Пример сохранения рисунка

Sub SaveActiveDrawing() ' Сохранить рисунок с текущим именем ThisDrawing.Save ' А теперь с новым именем ThisDrawing.SaveAs "MyDrawing.dwg" End Sub

Проверка были ли в рисунке какие-то изменения с момента последнего сохранения

Sub TestIfSaved() If Not (ThisDrawing.Saved) Then If MsgBox("Сохранить изменения?", vbYesNo) = vbYes Then ThisDrawing.Save End If End Sub

УСТАНОВКА СОБСТВЕННЫХ ПРЕДПОЧТЕНИЙ

Доступ к объекту Preferences

Dim acadPref as AcadPreferences Set acadPref = ThisDrawing.Application.Preferences

После чего можно получить доступ к любому объекту Preference (предпочтений) пользуясь свойствами Display, Drafting, Files, OpenSave, Output, Profile, Selection, System, и User properties. Например сменить размер перекрестия

acadPref.Display.CursorSize = 100

DATABASE PREFERENCES

Данный объект включает все настройки которые сохраняются всместе с текущим рисунком.

УПРАВЛЕНИЕ ОКНОМ ПРИЛОЖЕНИЯ

Пример смены размера и положения окна, минимизация и увеличение до максимума

Sub PositionApplicationWindow() ThisDrawing.Application.WindowTop = 0 ThisDrawing.Application.WindowLeft = 0 ThisDrawing.Application.width = 400 ThisDrawing.Application.height = 400 ThisDrawing.Application.WindowState = acMax ThisDrawing.Application.WindowState = acMin End Sub

Проверка состояния окна

Sub CurrentWindowState() Dim CurrWindowState As Integer Dim msg As String CurrWindowState = ThisDrawing.Application.WindowState msg = Choose(CurrWindowState, "normal", "minimized", "maximized") MsgBox "Окно приложения" + msg End Sub

Сделать окно невидимым

ThisDrawing.Application.Visible = False

УПРАВЛЕНИЕ ОКНОМ РИСУНКА

Аналогично окну приложения можно менять размеры и подчиненного окна — рисунка, как например:

Sub CurrentWindowState() Dim CurrWindowState As Integer Dim msg As String ThisDrawing.Width = 400 ThisDrawing.Height = 400 ThisDrawing.WindowState = acMin ThisDrawing.WindowState = acMax CurrWindowState = ThisDrawing.WindowState msg = Choose(CurrWindowState, "normal", "minimized", "maximized") MsgBox "Окно документа " + msg End Sub

ИСПОЛЬЗОВАНИЕ ZOOM.

Виды это особые комбинации расположения, масштаба и ориентации рисунка. Команда zoom не меняет размер рисунка, она влияет только на размер его отображения на экране. Автокад предлагает несколько путей «зуммирования» по указанному окну, вписать рисунок в окно, указать масштаб вручную. Для «зуммирования» с указанием границ используются методы ZoomWindow или ZoomPickWindow Первый из них позволяет все сделать чисто программно, второй требует ввода границ окна от пользователя. Пример:

Sub ZoomWindow() MsgBox "Увеличение в пределах:" & vbCrLf & "1.3, 7.8, 0" & vbCrLf & "13.7, -2.6, 0" Dim point1(0 To 2) As Double Dim point2(0 To 2) As Double point1(0) = 1.3: point1(1) = 7.8: point1(2) = 0 point2(0) = 13.7: point2(1) = -2.6: point2(2) = 0 ThisDrawing.Application.ZoomWindow point1, point2 MsgBox "А теперь ZoomPickWindow" ThisDrawing.Application.ZoomPickWindow End Sub

МАСШТАБИРОВАНИЕ ВИДА

  • Относительно границ рисунка
  • Относительно текущего вида
  • Относительно единиц вычерчивания на листе
Sub ZoomScaled() MsgBox "Масштабирование:" & vbCrLf & "Тип: acZoomScaledRelative" & vbCrLf & "Фактор: 2" Dim scalefactor As Double Dim scaletype As Integer scalefactor = 2 scaletype = acZoomScaledRelative ThisDrawing.Application.ZoomScaled scalefactor, scaletype End Sub

ЦЕНТРИРОВАНИЕ

Указанную точку рисунка можно поместить по центру экрана методом ZoomCenter как в следующем примере:

Sub ZoomCenter() MsgBox "Центрировать:" & vbCrLf & "Центр: 3,3,0" & vbCrLf & "Увеличение: 10" Dim Center(0 To 2) As Double Dim magnification As Double Center(0) = 3: Center(1) = 3: Center(2) = 0: magnification = 10 ThisDrawing.Application.ZoomCenter Center, magnification End Sub

ПОКАЗ ГРАНИЦ (LIMITS) И ПРОТЯЖЕННОСТИ (EXTENTS) РИСУНКА

Для отображения границ рисунка или границ объектов используется методы ZoomAll, ZoomExtents, ZoomPrevious . Первый из них показывает рисунок полностью. Если границы объектов выходят за пределы границ рисунка, то показывается по границам объектов и наооборот.

ZoomExtents позволяет указать в активном видовом экране границы рисунка в котором отображаются все ранее построенные объекты текущей вкладки рисунка, находящиеся на включенных и размороженных слоях.

ZoomAll аналогично ZoomExtents но при этом включается еще и зона границ. Если зона границ окажется заполнена мало все окно может оказаться пустым. Наиболее удобный вариант просмотра всего рисунка — первый

Sub ZoomAll() MsgBox "ZoomAll" ThisDrawing.Application.ZoomAll MsgBox "ZoomExtents" ThisDrawing.Application.ZoomExtents End Sub

ИСПОЛЬЗОВАНИЕ ИМЕНОВАННЫХ ВИДОВ

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

Sub AddView() Dim viewObj As AcadView Set viewObj = ThisDrawing.Views.Add("View1") msgbox "А теперь удалить вид" ThisDrawing.Views("View1").Delete End Sub

Видовой экран можно разбивать на части методами: acViewport2Horizontal, acViewport2Vertical, acViewport3Left, acViewport3Right, acViewport3Horizontal, acViewport3Vertical, acViewport3Above, acViewport3Below, acViewport4.

Sub SplitAViewport() Dim vportObj As AcadViewport Set vportObj = ThisDrawing.Viewports.Add("TEST_VIEWPORT") vportObj.Split acViewport2Horizontal ThisDrawing.ActiveViewport = vportObj End Sub

Пример разбивки видовых экранов и перебор открытых окон

Sub IteratingViewportWindows() Dim vportObj As AcadViewport Set vportObj = ThisDrawing.Viewports.Add("TEST_VIEWPORT") ThisDrawing.ActiveViewport = vportObj ' сделать активным vportObj.Split acViewport4 ' Разбить на 4 окна ' Перебор видовых экранов, подсвечивая каждый ' и показывая углы для каждого Dim vport As AcadViewport Dim LLCorner As Variant,URCorner As Variant For Each vport In ThisDrawing.Viewports ThisDrawing.ActiveViewport = vport LLCorner = vport.LowerLeftCorner URCorner = vport.UpperRightCorner MsgBox "Видовой экран: " & vport.Name & " активнен." & _ vbCrLf & "Нижний левый угол: " & _ LLCorner(0) & ", " & LLCorner(1) & _ vbCrLf & "Верхний правый: " & URCorner(0) & ", " & URCorner(1) Next vport End Sub

Обновление содержимого экрана нужно потому что не все методы сразу это делают

Sub UpdateDisplay() Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 1: center(1) = 1: center(2) = 0: radius = 1 Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius) circleObj.Color = acRed circleObj.Update End Sub

ПЕРЕУСТАНОВКА АКТИВНЫХ ОБЪЕКТОВ

Изменение большинства активных объектов (слоев, типов линий) вступает в силу немедленно, однако некоторые активные объекты требуют повторной установки. (это стили текста, видовые экраны и ПСК). Для их переустановки требуется установка свойств ActiveTextStyle, ActiveUCS, ActiveViewport.

Sub ResetActiveViewport() ' переключим сетку ThisDrawing.ActiveViewport.GridOn = Not (ThisDrawing.ActiveViewport.GridOn) ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport End Sub

УСТАНОВКА И СЧИТЫВАНИЕ СИСТЕМНЫХ ПЕРЕМЕННЫХ

У объекта Document есть два метода на этот случай SetVariable и GetVariable. Пример ThisDrawing.SetVariable «TEXTFILL», 1

ВЫСОКОТОЧНОЕ ВЫЧЕРЧИВАНИЕ

Автокад позволяет вычерчивать объекты с точно заданными характеристиками, не прибегая при этом к утомительным вычислениям. Ограничем VBA для Autocad 2000 является то что через VBA нельзя установить изометрическую сетку и привязку, установить объектную привязку, указать измеряемые отрезки на объекте или поделить объект на сегменты.

РЕГУЛИРОВКА ПРИВЯЗКИ И ВЫРАВНИВАНИЯ СЕТКИ

Изменение угла и базовой точки. В данном примере базовая точка устанавливается равной 1,1 и угол наклона сетки 30 градусов.

Sub ChangeSnapBasePoint() ' Включим сетку ThisDrawing.ActiveViewport.GridOn = True ' Сменим базовую точку 1,1 Dim newBasePoint(0 To 1) As Double newBasePoint(0) = 1: newBasePoint(1) = 1 ThisDrawing.ActiveViewport.SnapBasePoint = newBasePoint ' Сменим угол для привязки на 30 градусов (.575 радиан) Dim rotationAngle As Double rotationAngle = 0.575 ThisDrawing.ActiveViewport.SnapRotationAngle = rotationAngle ' переустановим видовой экран ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport End Sub

Включение режима ОРТО (нужен для простой отрисовки перпендикуляров)

ThisDrawing.ActiveViewport.OrthoOn = True

Построение конструкционных линий (это те которые в обе стороны бесконечны)

Sub AddXLine() Dim xlineObj As AcadXline Dim basePoint(0 To 2) As Double Dim directionVec(0 To 2) As Double basePoint(0) = 2#: basePoint(1) = 2#: basePoint(2) = 0# directionVec(0) = 1#: directionVec(1) = 1#: directionVec(2) = 0# Set xlineObj = ThisDrawing.ModelSpace.AddXLine (basePoint, directionVec) ThisDrawing.Application.ZoomAll End Sub

Опрос конструкционных линий. В примере ищется базовая точка и направляющий вектор

Dim BPoint As Variant Dim Vector As Variant Set BPoint = xlineObj.basePoint Set Vector = xlineObj.DirectionVector

СОЗДАНИЕ, ОПРОС И РЕДАКТИРОВАНИЕ ЛУЧЕЙ

Sub EditRay() Dim rayObj As AcadRay Dim basePoint(0 To 2) As Double,secondPoint(0 To 2) As Double ' Определим луч basePoint(0) = 3#: basePoint(1) = 3#: basePoint(2) = 0# secondPoint(0) = 4#: secondPoint(1) = 4#: secondPoint(2) = 0# ' Создадим луч в пространстве модели Set rayObj = ThisDrawing.ModelSpace.AddRay (basePoint, secondPoint) ThisDrawing.Application.ZoomAll ' Получим состояние луча MsgBox "Базовая точка луча: " & rayObj.basePoint(0) & ", " & _ rayObj.basePoint(1) & ", " & rayObj.basePoint(2) & vbCrLf & _ "Направляющий вектор луча: " & rayObj.DirectionVector(0) & ", " & _ rayObj.DirectionVector(1) & ", " & rayObj.DirectionVector(2) ' Изменим направляющий вектор луча Dim newVector(0 To 2) As Double newVector(0) = -1 : newVector(1) = 1 : newVector(2) = 0 rayObj.DirectionVector = newVector ThisDrawing.Regen False MsgBox "Базовая точка луча: " & rayObj.basePoint(0) & ", " & _ rayObj.basePoint(1) & ", " & rayObj.basePoint(2) & vbCrLf & _ "Направляющий вектор луча: " & rayObj.DirectionVector(0) & ", " & _ rayObj.DirectionVector(1) & ", " & rayObj.DirectionVector(2) End Sub

ВЫЧИСЛЕНИЯ С ИСПОЛЬЗОВАНИЕМ ВЫРАЖЕНИЙ

  • Найти угол линии от оси X методом AngleFromXAxis
  • Преобразовать угол из строки в вещественное (двойной точности) методом AngleToReal
  • Преобразовать угол из вещественного (двойной точности) в строку методом AngleToString
  • Преобразовать расстояние из строки в вещественное (двойной точности) методом DistanceToReal
  • Создать переменную типа Variant, содержащую массив целых, с плавающей точкой двойной точности и т.д. методом CreateTypedArray
  • Найти точку отложенную на заданном расстоянии и под заданным углом методом PolarPoint
  • Перевести точку в другую систему координат методом TranslateCoordinates
  • Найти расстояние между двумя точками методом GetDistance
Sub GetDistanceBetweenTwoPoints() Dim returnDist As Double returnDist = ThisDrawing.Utility.GetDistance (, "Выбери 2 точки.") MsgBox "Расстояние между точками: " & returnDist End Sub

ПОДСЧЕТ ПЛОЩАДЕЙ

Можно выполнить используя значение свойства Area , пример.

Sub CalculateDefinedArea() Dim p1 As Variant,p2 As Variant,p3 As Variant,p4 As Variant,p5 As Variant ' Получить точки от пользователя p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "1-ая точка: ") p2 = ThisDrawing.Utility.GetPoint(p1, vbCrLf & "2-ая точка: ") p3 = ThisDrawing.Utility.GetPoint(p2, vbCrLf & "3-ая точка: ") p4 = ThisDrawing.Utility.GetPoint(p3, vbCrLf & "4-ая точка: ") p5 = ThisDrawing.Utility.GetPoint(p4, vbCrLf & "5-ая точка: ") ' Создаем двумерную полилинию Dim polyObj As AcadLWPolyline Dim vertices(0 To 9) As Double vertices(0) = p1(0): vertices(1) = p1(1) vertices(2) = p2(0): vertices(3) = p2(1) vertices(4) = p3(0): vertices(5) = p3(1) vertices(6) = p4(0): vertices(7) = p4(1) vertices(8) = p5(0): vertices(9) = p5(1) Set polyObj = ThisDrawing.ModelSpace.AddLightWeightPolyline (vertices) polyObj.Closed = True ThisDrawing.Application.ZoomAll MsgBox "Площадь определенная точками " & polyObj.Area End Sub

ПОЛУЧЕНИЕ ВВОДА ОТ ПОЛЬЗОВАТЕЛЯ

Объект Utility может получать ввод от пользователя данных определенного типа, например метод GetString возвращает строку, GetPoint возвращает значение типа Variant и GetInteger возвращает целое. Управление вводом пользователя можно осуществлять методом InitializeUserInput . Он позволяет проверять пустой ввод (NULL), ввод отрицательных значений. Метод GetString принимает два параметра, если первый из них равен 0, то пробел сразу завершает ввод, второй — строка подсказка.

Sub GetStringFromUser() Dim retVal As String retVal = ThisDrawing.Utility.GetString (1, vbCrLf & "Как вас зовут: ") MsgBox "Привет, " & retVal End Sub

Метод GetPoint тоже принимает два параметра, необязательную первую точку и строку подсказки. Для ограничения выбора пользователя при вводе может использовать вызов метода InitializeUserInput .

Sub GetPointsFromUser() Dim startPnt As Variant,endPnt As Variant Dim prompt1 As String,prompt2 As String prompt1 = vbCrLf & "Начальная точка линии: " prompt2 = vbCrLf & "Конечная точка линии: " startPnt = ThisDrawing.Utility.GetPoint(, prompt1) ' Используем ранее введенную точку как базовую endPnt = ThisDrawing.Utility.GetPoint(startPnt, prompt2) ThisDrawing.ModelSpace.AddLine startPnt, endPnt ThisDrawing.Application.ZoomAll End Sub

Метод GetKeyword принимает только один параметр, это ключевое слово Autocad и так же может использовать вызова метода InitializeUserInput .

Sub KeyWord() Dim keyWord As String ThisDrawing.Utility.InitializeUserInput 1, "Line Circle Arc" keyWord = ThisDrawing.Utility.GetKeyword (vbCrLf & "Введите (Line/Circle/Arc): ") MsgBox keyWord End Sub

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

Sub KeyWord2() Dim keyWord As String ThisDrawing.Utility.InitializeUserInput 0, "Line Circle Arc" keyWord = ThisDrawing.Utility.GetKeyword (vbCrLf & "Введите (Line/Circle/): ") If keyWord = "" Then keyWord = "Arc" MsgBox keyWord End Sub

УПРАВЛЕНИЕ ВВОДОМ ПОЛЬЗОВАТЕЛЯ

Применение метода InitializeUserInput позволяет определить ключевые слова или ограничить тип вводимых значений. Данный метод может применяться совместно со следующими методами GetAngle, GetCorner, GetDistance, GetInteger, GetKeyword, GetOrientation, GetPoint, GetReal (но не с GetString, в этом случае есть метод GetInput для получения строкового значения).

Метод InitializeUserInput принимает два параметра — первый битовое значение, определяющее опции ввода, второй строковый — определяет допустимые ключевые слова.

ПОЛУЧЕНИЕ ЦЕЛОГО ИЛИ КЛЮЧЕВОГО СЛОВА ПУТЕМ ВВОДА В КОМАНДНОЙ СТРОКЕ

Пример ввода положительного целого

Sub UserInput() ' Первый параметр (6) ограничивает ввод положительными целыми ' Второй список ключевых слов ThisDrawing.Utility.InitializeUserInput 6, "Big Small Regular" Dim promptStr As String promptStr = vbCrLf & "Размер (Big/Small/[Regular]):" ' Ввод ключевого слов в метод GetInteger вызовет ошибку ' чтобы позволить программе выполняться дальше ' установим обработчик ошибок On Error Resume Next ' Получить ввод от пользователя Dim returnInteger As Integer returnInteger = ThisDrawing.Utility.GetInteger(promptStr) ' Проверить нет ли ошибки, затем использовать GetInput для получения ' строки иначе значение returnInteger. If Err.Description = "User input is a keyword" Then Dim returnString As String returnString = ThisDrawing.Utility.GetInput() Err.Clear Else If returnInteger = 0 Then ' Нажат ENTER returnString = "Regular" ' значение по-умолчанию Else returnString = returnInteger ' введенное значение End If End If MsgBox returnString, , "Пример InitializeUserInput" End Sub

ДОСТУП К КОМАНДНОЙ СТРОКЕ AUTOCAD

Имитировать ввод команд в командную строку с возможностью передачи параметров команде позволяет метод SendCommand . Пробел в данной строке эквивалентен нажатию Enter. Вызов данного метода без аргументов не допускается.

Следующий пример создает окружность с центром (2,2,0) и радиусом 4.

Sub SendACommandToAutoCAD() ThisDrawing.SendCommand "_Circle 2,2,0 4 " ThisDrawing.SendCommand "_zoom a " End Sub

Обратите внимание на пробел в конце каждой строки.

ЕСЛИ НЕ ОТКРЫТ НИ ОДИН ДОКУМЕНТ

  • Открыть документ
  • Создать документ
  • Импортировать документ
  • Выйти из Autocad

ИМПОРТ ФАЙЛОВ ДРУГИХ ФОРМАТОВ

Метод Import позволяет импортировать файлы форматов DXF, SAT, BMP, PostScript. Он принимает три параметра: имя файла, точку вставки и фактор масштабирования.

ЭКСПОРТ В ДРУГИЕ ФОРМАТЫ

Метод Export поддерживает следующие форматы: WMF, SAT, EPS, DXF, DWF, BMP. Он принимает три параметра: имя создаваемого файла, тип создаваемого файла и набор экспортируемых объектов. При экспорте в WMF, SAT или BMP должен существовать непустой набор. В EPS и DXF экспортируется весь рисунок.

Пример эскпорта-импорта в DXF

Sub ImportingAndExporting() ' Созадим окружность, чтоб было что экспортировать Dim circleObj As AcadCircle Dim centerPt(0 To 2) As Double,radius As Double centerPt(0) = 2: centerPt(1) = 2: centerPt(2) = 0: radius = 1 Set circleObj = ThisDrawing.ModelSpace.AddCircle(centerPt, radius) ThisDrawing.Application.ZoomExtents ' Создадим пустой набор Dim sset As AcadSelectionSet Set sset = ThisDrawing.SelectionSets.Add("NEWSSET") ' Экспорт в файл C:\DXFExprt, если каталог не существует - ошибка Dim exportFile As String exportFile = "C:\DXFExprt" ThisDrawing.Export exportFile, "DXF", sset ' Определим импорт Dim importFile As String Dim insertPoint(0 To 2) As Double Dim scalefactor As Double importFile = "C:\DXFExprt.dxf" insertPoint(0) = 0: insertPoint(1) = 0: insertPoint(2) = 0: scalefactor = 2# ' Импортируем файл ThisDrawing.Import importFile, insertPoint, scalefactor ThisDrawing.Application.ZoomExtents End Sub

Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

В своих программах я использую следующий вызов Excel из AutoCAD:

On Error Resume Next Set ПрограммаAutoCAD = ThisDrawing.Application If ПриложениеExcell Is Nothing Then ПроверитьПолучениеExcel: ' Функция GetObject, вызванная без указания первого аргумента, ' возвращает ссылку на экземпляр приложения. Если это приложение ' не запущено, возвращается ошибка. Обратите внимание на запятую, ' стоящую на месте отсутствующего первого аргумента. Set ПриложениеExcell = VBA.GetObject(, "Excel.Application") If ПриложениеExcell Is Nothing Then Set ПриложениеExcell = VBA.GetObject("", "Excel.Application") GoTo ПроверитьПолучениеExcel End If End If ' Проверка Excel. Если Excel выполняется, ' он вводится в таблицу выполняемых объектов (Running Object table). If DetectExcel = 0 Then Set ПриложениеExcell = Nothing GoTo ПроверитьПолучениеExcel End If Err.Clear ПриложениеExcell.Visible = True 'Описываем необходимые процедуры API: Private Declare Function FindWindow Lib "user32" Alias _ "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As Long) As Long Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Public Function DetectExcel() As Long ' Процедура находит выполняемый Excel и регистрирует его. Const WM_USER = 1024 Dim hWnd As Long ' Если Excel выполняется, этот вызов API возвращает его дескриптор. hWnd = FindWindow("XLMAIN", 0) If hWnd = 0 Then ' 0 означает, что Excel не выполняется. DetectExcel = 0 Exit Function Else ' Excel выполняется. Используйте функцию API SendMessage, чтобы ввести его в таблицу выполняемых объектов (Running Object Table). ' SendMessage hWnd, WM_USER + 18, 0, 0 DetectExcel = hWnd End If End Function

Далее можно работать в Excel сколько угодно, а потом когда надо закрыть файл Excel и запустить другой файл происходит следующее:
1) Закрываем Excel при этом процесс Excel остаётся активным в диспетчере задач, а сам Exel при этом уже закрыт. Спрашивается: почему остался работающим процесс, когда программа уже закрылась? Может надо чтобы команду закрытия процесса дал AutoCAD, потому что Excel запускался из AutoCAD? Как это сделать? Или надо специальным образом запускать Excel чтобы следить за тем когда он закрывается?
2) Если попытаться открыть другой файл Excel то Excel работает без отображения ячеек. На экране видны только команды меню и панели инструментов. Ячеек не видно, вместо них чертёж AutoCAD или окно другой работающей программы. Доступа к ячейкам нет. Ясно, что с таким Excelем работать нельзя, неопытных пользователей это просто приводит в ужас! Появляются претензии, что я своим макросом испортил настройки в компьютере и Excel перестал правильно работать! Конечно, чтобы справиться с этой проблемой надо закрыть Excel, открыть диспетчер задач, найти там всё ещё работающий процесс Excel и остановить его. После этого можно запускать снова Excel и никаких проблем не будет. Но разьве объяснишь это обычным пользователям, для обычных пользователей это просто дико слушать и в итоге программа никому не нравится. Спрашивается зачем было делать эту ложку дёгтя в бочка мёда работы Excel из AutoCAD? Как надо правильно запускать Excel из AutoCAD, чтобы он правильно закрывался и нормально потом запускался снова и не было претензий от других пользователей программы?

#2 Ответ от Миша 6 июня 2006г. 03:14:03

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

Замечено, что если после закрытия Excel в п.1 закрыть AutoCAD лишний процесс Excel в диспетечере задач тоже останавливается. Может есть специальный метод который может остановить этот процесс без закрытия AutoCAD?
И ещё вопрос: Правильно ли я сделал что отключил вызов функции

' SendMessage hWnd, WM_USER + 18, 0, 0

так как и без этой функции процесс Excel запускается в диспетчере задач? У меня программа и так работает. По логике, чтобы остановить процесс Excel надо запустить функцию противоположную функции «SendMessage», только что это за функция и как организовать запуск этой функции, чтобы она всегда была на готове и ждала когда закроется Excel? По моему это очень сложно и невозможно. Как вы думаете нет решения этой проблемы?

#3 Ответ от kpblc 6 июня 2006г. 08:54:09

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

ИМХО (поскольку с VBA мало работаю) — наверное, проблема в том, что Excel при вызове подобным методом используется ACAD’ом как СОМ-сервер, соответственно его надо релизить. Но время «освобождения», во-первых, неизвестно, а, во-вторых, при работе через lisp Excel тоже далеко не сразу закрывается. Я думаю, что надо все же использовать другие методы вызова Excel’a и обращения с ним.

#4 Ответ от StudentCM 26 декабря 2007г. 15:54:19

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

Закрываем Excel при этом процесс Excel остаётся активным в диспетчере задач, а сам Exel при этом уже закрыт. Спрашивается: почему остался работающим процесс, когда программа уже закрылась? Может надо чтобы команду закрытия процесса дал AutoCAD, потому что Excel запускался из AutoCAD? Как это сделать?

у меня проблема один в один была, просто ужас. освобождение через Nothing не помогало. интересно, что если выгрузить проект или выйти из автокада или (!) нажать alt+f11 и кнопочку Стоп(Reset) на панели VBAEditor’а, то этот фантомный процесс исчезает!! 8-(
Бился два дня, искал решения и через API и через LISP, и уже когда отчаялся и хотел забить. Вот как в итоге решился гемор. Знатоки, может это вам будет интересно.
в конце кода вставить End

Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End End With End Sub

Видимо для VBA End помощнее, чем обыкновенное End Sub и этот End рубит концы и в памяти машины.

#5 Ответ от Dron 27 декабря 2007г. 02:16:59

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

Тоже сталкивался с подобной проблемой. Кстати, подобная проблема возникает и при выгрузке файлов из Excel, в списке объектов, в VBA редакторе, они остаются.
Данная проблема связана как раз именно с освобождением используемых объектов.
Просто перед выгрузкой приложения, всем объектам, которые вы использовали (листы, ячейки, файлы, графические объекты и т. д.), необходимо присвоить Nothing. В противном случае, вызванное приложение само эти объекты не освобождает, поэтому будет активным в системе до освобождения всех объектов или до выгрузки вызывающего приложения, что автоматически ведёт к освобождению всех объектов.
Поэтому проверьте повнимательней свой программный код.
Что касается использования END, то это равноценно завершению работы вашего приложения, что автоматически ведёт к закрытию всех объектов.
На самом деле вопрос не однозначен. В чём конкретно суть задачи.
Запустить програмно Excel, выполнить код и оставить Excel открытым, но при этом ваше приложение свою работу завершает полностью или оно тоже остаётся активным и пользователь работает параллельно в Excel и вашем приложении, а проблема возникает когда пользователь сам закрывает Excel и ваше приложение повторно его открывает? Если в этом, то перед:

If ПриложениеExcell Is Nothing Then
Set ПриложениеExcell = Nothing

плюс к этому освобождение всех используемых объектов.

#6 Ответ от StudentCM 27 декабря 2007г. 10:05:09

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

Спасибо за ответ. Суть задачи — открыть эксель, заполнить таблицу данными из чертежа и завершить приложение, оставив Excel открытым в полное распоряжение пользователя. Все просто.
Приведу код, отвечающий за это:

. 'в наборе будут вхождения блоков с нужными атрибутами sset.Select acSelectionSetAll, , , fT, fD Dim xlApp As Excel.Application Set xlApp = Nothing Dim xlBook As Workbook Dim xlSheet As Worksheet On Error Resume Next Err.Clear Set xlApp = GetObject(, "Excel.Application") If Err <> 0 Then Err.Clear Set xlApp = CreateObject("Excel.Application") If Err <> 0 Then MsgBox "Cannot start Excel", vbExclamation End End If End If Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) xlApp.Visible = True Cells(1, 1).Value = "Номер" Cells(. ).Value = ". " . Dim atts As Variant 'для атрибутов For i = 0 To sset.Count - 1 atts = sset(i).GetAttributes Cells(i + 2, 1).Value = atts(0).TextString Cells(. ).Value = atts(. ).TextString . Next i 'далее выбор и сортировка Dim myRan As Excel.Range Set myRan = Range("A2", Cells(sset.Count + 1, 5)) myRan.Sort Cells(2, 1) Set myRan = Nothing Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End End With End Sub

Без End в конце кода, если пользователь закроет Excel, то процесс будет висеть и повтороно приложение не запустится. Не понимаю почему, но теперь, елси пользователь нЕ закроет Excel, и запустит приложение, то новая книга создастся, однако ничего не заполнится 🙁
Ясно, что что-то где-то забыл, но что? Может, Excel вызываю как-то криво.

#7 Ответ от brigval 27 декабря 2007г. 16:35:20

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

#8 Ответ от StudentCM 27 декабря 2007г. 17:05:53

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

2 brigval
Спасибо большое за исправление!
Удивительное рядом.
Теперь, когда все закрыто запускаю Excel, просто новый документ. Когда начинаю вводить что-нибудь в ячейки ЗАПУСКАЕТСЯ ПРОЦЕСС ACAD.EXE в невидимом режиме. Когда хочу открыть файл, из которого раньше списывал атрибуты, говорит, что ОН УЖЕ МНОЮ ОТКРЫТ! Наверное уже в реестре что-то засело. Замечено, что с «фантомным» автокадом запускается процесс ~e5d141.tmp и процесс WSCommCntr1.exe. А при удалении этих процессов мой макрос все-равно работает.
Подскажите, пожалуйста, как избежать лишних (СОМ?)связей между приложениями, в чем может быть проблема?

#9 Ответ от Dron 28 декабря 2007г. 01:34:54

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

В конце кода у тебя стоит код закрытия не существующего цикла (по крайней мере в приведённом куске):

End With

Странно, что VBA не выругался.
Удали данную строку и строку с END.
Приведённая задача простейшая и стандартная, проблем быть не должно.
Вызов Excel не причём, ошибка где-то в другом, но в приведённом коде, за исключением выше сказанного, всё в порядке.
По поводу:

xlSheet.Cells(1, 1).Value = .

если работаешь с активным листом в активной книге, то указание листа или книги не обязательно.

#10 Ответ от brigval 28 декабря 2007г. 19:59:27

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

Dron пишет:

Мы не знаем, что было выше в коде.

если работаешь с активным листом в активной книге, то указание листа или книги не обязательно.

Я так думаю, что это справедливо для VBA for Exсel, в других случаях (и для VBA For AutoCAD) я всегда указываю «родителя».

#11 Ответ от Dron 29 декабря 2007г. 01:52:01

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

> brigval
Прошу прощения, на самом деле я имел ввиду, что это не должно вызывать описанную проблему.
Что касается End With, предположил что компилятор дойдя до END не реагирует на то, что после него. Проверил, оказался не прав. Где-то выше он видимо открыт. Значит ошибка в не достающей части кода.

#12 Ответ от StudentCM 29 декабря 2007г. 12:16:53

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

Господа, очень признателен вам за внимание к моей проблеме. всех с наступающим праздником! )выложу весь код, если не охота сегодня работать, то можно покопаться в нем )).
2Dron & 2brigval
обращение с указанием «родителя» убрало ту ошибку, при которой, если Excel уже был открыт, то в ячейки ничего не записывалось.
Вот весь код модуля, но нем много «лишнего», не относящегося к проблеме:

Public Sub AttExtract() With ThisDrawing [i][b]'определим набор для необходимых вхождений блоков.[/i][/b] Dim sset As AcadSelectionSet DeclareSSet sset, "4attsset" [i]'это моя фунцкия для перебора и удаления существующего имени и записи в SelectionSets. просто облегчает жизнь и уж точно работает )) [/i] [i]'далее описывается механизм выбора и фильтрации, принципиально к имеющимся проблемам не относится. 'создаем механизм фильтрации для набора. нужные вхождения характеризуются символами "_NB" в конце имени. переберем коллекцию чертежа Blocks, одновременно создавая механизм фильтрации по нужным именам.[/i] Dim BlColl As AcadBlocks Set BlColl = .Blocks Dim Blk As AcadBlock Dim fT() As Integer [i]'FilterType[/i] Dim fD() As Variant [i]'FilterData[/i] Dim i As Integer i = 2 [i]'для размеров дин.массивов. '2', потому что первые сейчас определим ->[/i] ReDim fT(1): ReDim fD(1) fT(0) = 0: fD(0) = "INSERT" [i]'по вхождениям блоков[/i] fT(1) = -4: fD(1) = "" i = i + 1 End If Next [i][b]'теперь есть необходимый фильтр - выберем по всему чертежу то, что нужно[/i][/b] sset.Select acSelectionSetAll, , , fT, fD If sset.Count = 0 Then GoTo NoBlRef [i]'в конец программы[/i] End If [i][b]'теперь нужно выводить атрибуты вхождений из набора в Excel.[/i][/b] [i]'Начинается самое интересное ).[/i] Dim xlApp As Excel.Application Set xlApp = Nothing Dim xlBook As Workbook Dim xlSheet As Worksheet On Error Resume Next Err.Clear Set xlApp = GetObject(, "Excel.Application") If Err <> 0 Then Err.Clear Set xlApp = CreateObject("Excel.Application") If Err <> 0 Then MsgBox "Cannot start Excel", vbExclamation End End If End If Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) xlApp.Visible = True With xlSheet [i][b]'Обозначим столбцы[/b] 'Один столбец пропущен для спец.символов номеров, потом удалим после сортировки[/i] .Cells(1, 1).Value = "Номер кабеля" .Cells(1, 3).Value = "Тип кабеля" .Cells(1, 4).Value = "Длина кабеля" .Cells(1, 5).Value = "Начало" .Cells(1, 6).Value = "Конец" [i]'определим Range для форматирования последующей сортировки[/i] Dim myRan As Excel.Range Set myRan = .Range("A2", .Cells(sset.Count + 1, 6)) myRan.NumberFormat = "@" [i]'текстовый[/i] Dim atts As Variant [i]'для атрибутов[/i] Dim sNum As String [i]'для строки номера[/i] Dim sRNum As String [i]'для начальной "цифренной" части номера[/i] Dim sDopNum As String [i]'для дополнительной "символьной" части номера[/i] For i = 0 To sset.Count - 1 [i]'пройдемся по набору[/i] atts = sset(i).GetAttributes [i]'достаем атрибуты[/i] sNum = atts(0).TextString sRNum = IsNum(sNum) [i]'фунуция IsNum из строки возвращает Long из первых цифренных символов строки, если только текст, возвращает Long=0[/i] If sRNum = "0" Then [i]'тогда это просто текст[/i] sRNum = sNum sDopNum = "" [i]'и символьная часть не нужна[/i] Else sDopNum = Right(sNum, Len(sNum) - Len(sRNum)) [i]'отделили символьную часть номера[/i] End If [i][b]'запись в ячейки[/i] [/b] .Cells(i + 2, 1).Value = sRNum [i]'номер кабеля "реальный"[/i] .Cells(i + 2, 2).Value = sDopNum [i]'символьная часть номера[/i] .Cells(i + 2, 3).Value = sset(i).Layer [i]'тип кабеля[/i] .Cells(i + 2, 4).Value = CInt(atts(1).TextString) [i]'длина кабеля[/i] .Cells(i + 2, 5).Value = atts(2).TextString [i]'начало[/i] .Cells(i + 2, 6).Value = atts(3).TextString [i]'конец[/i] Next i [i][b]'сортируем [/b] во-первых по номеру, во-вторых по "символьным" частям[/i] myRan.Sort Key1:=.Cells(2, 1), Key2:=.Cells(2, 2), DataOption1:=xlSortTextAsNumbers [i]'объединим номер с принадлежащей ему "символьной" частью[/i] For i = 1 To sset.Count + 1 sNum = .Cells(i, 1).Value + .Cells(i, 2).Value .Cells(i, 1).Value = sNum Next 'удалим теперь вспомогательный столбец для символьных частей .Columns(2).Delete End With Set myRan = Nothing Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End NoBlRef: MsgBox "Нет засечек кабелей" Exit Sub End With End Sub

#13 Ответ от Dron 30 декабря 2007г. 02:35:54

Re: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel

Единственное, что могу посоветовать, проверить самое начало:

Dim sset As AcadSelectionSet DeclareSSet sset, "4attsset" 'это моя фунцкия для перебора и удаления существующего имени и записи в SelectionSets. просто облегчает жизнь и уж точно работает ))

Скорее всего проблема именно здесь.
В API и COM я не силён, поэтому не понял каким образом происходит декларация функции имеющей имя, только что определённой переменной как коллекция.
Может проблема именно в данной функции, именно она что-то не освобождает.
Могу предложить для отработки кода, только одно, перекинуть эту функцию в данный модуль, как процедуру или функцию, и обращаться к ней, а декларацию убрать.
Что касается END, обычно он используется во вложенных процедурах или фукциях, для выхода из программы. А здесь вроде как одна процедура, может стоит заменить на EXIT SUB. И зачем EXIT SUB в самом конце кода?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *