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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCad и Delphi. Добавление точки

AutoCad и Delphi. Добавление точки

Ответ
Поиск в этой теме
Непрочитано 25.02.2008, 21:45 #1
AutoCad и Delphi. Добавление точки
Зойберг
 
Регистрация: 25.02.2008
Сообщений: 9

Здравствуйте. Вопрос относительно использования COM-объектов AutoCad из внешней среды программирования (Delphi).

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

Я хотел вызвать метод AddPoint, принимающий 3-хэлементный массив в качестве параметра. Но как ни пробовал, синтаксис не подходит.

(Пробовал:
.AddPoint('200,200,200')
.AddPoint('[200,200,200]')
.AddPoint('(200,200,200)') и т.д.)

Подскажите, пожалуйта, как из Delphi правильно указать этот массив.
Просмотров: 6270
 
Непрочитано 25.02.2008, 22:33
#2
Кулик Алексей aka kpblc
Moderator

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


Пост отделил.
---
Если посмотреть справку AutoCAD'a, становится видно, что:
1. Добавлять точку в приложение нельзя. Ее можно добавлять в пространство (модели, листа, блока...)
2. Для добавления используется именно Variant. Я не знаю Delphi, но в VB это выглядит примерно так (для варианта позднего связывания; для раннего связывания надо импортировать библиотеки и в результате зависеть от версии):
Код:
[Выделить все]
Dim acad As Object, pt As Object
Dim coord(2) As Double
  coord(0) = 100#: coord(1) = 200#: coord(2) = 0#
  Set acad = GetObject(, "AutoCAD.Application")
  Set pt = acad.ActiveDocument.ModelSpace.AddPoint(coord)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.02.2008, 15:26
#3
Зойберг


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


Я получил доступ не к Application, а именно к ModelSpace.

Всё дело в том, что эту строку - "Dim coord(2) As Double" - я не знаю как написать в Delphi. Пробовал создавать в Delphi переменную Variant, в которой хранится этот массив, но тоже безрезультатно.

Ведь Dim - это не метод объекта, а внутренний оператор VBA. Вот в этом-то и сложнось, как получить доступ к операторам VBA из Delphi.
Зойберг вне форума  
 
Непрочитано 26.02.2008, 16:37
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Здесь сообщение Александра (выделено мной). Может поможет
Цитата:
Все зависит от задачи. Но простейший вариант такой. Экспортируем acad.tlb и начинаем переводить примеры из руководства с бейсика на паскаль. Никаких особых хитростей не требуется.
Только следует помнить что если в VBA пишется
Dim centerPoint(0 To 2) As Double
На паскаль переводится
Var Center:OleVariant;
Center:=VarArrayCreate([0,2],varDouble);
И в нужных местах типы приводятся примерно так
Var Obj:IAcadObject;
Var Color:Integer;
Color:=(Obj as IAcadEntity).Color;
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 26.02.2008, 18:36
#5
Зойберг


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


Да, спасибо большое, вы мне очень помогли, всё работает.

Ещи один маленький вопрос: что-то я не могу разобраться, какой объект и какое свойство отвечает за Point Style (кружок или квадратик или крестик и т.д.)?
Зойберг вне форума  
 
Непрочитано 26.02.2008, 18:59
#6
Кулик Алексей aka kpblc
Moderator

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


см.системные переменные pdmode и pdsize
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.02.2008, 20:35
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Эх, кто бы мне сказал как это делать на JScript, или VBScript, расцеловал-бы "виртуально".
Supermax вне форума  
 
Непрочитано 26.02.2008, 21:24
#8
Кулик Алексей aka kpblc
Moderator

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


Если получены указатели на текущий документ, то для VB будет вроде бы так:
PointerActiveDocument.SetValue(<Имя переменной>, <Значение>)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.02.2008, 22:09
#9
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Это ты кому? Мне?
Supermax вне форума  
 
Непрочитано 26.02.2008, 22:17
#10
Кулик Алексей aka kpblc
Moderator

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


Тебе. Я предположил, что тебе надо установить системные переменные. А тебе что, точку надо добавить? Так принципиально-то ничего не меняется по сравнению с #2...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.02.2008, 16:43
#11
Зойберг


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


Кулик Алексей aka kpblc
Получил доступ к ActiveDocument, вызвал SetVariable('PdMode',2), и AutoCad выдал ошибку "Error Setting System Variable". Думал, что в имени переменной с регистром не так, но метод GetVariable работает, поэтому не знаю в чём дело...
Зойберг вне форума  
 
Непрочитано 27.02.2008, 17:26
#12
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Я думаю здесь ShaggyDoc может внести ясность. Как вариант, в ActiveDocument есть метод Sendcommand. Пошли туда строчку "'_.PDMODE\n2\n", где символ \n - перевод каретки (ENTER) или ASCII 10
*** Добавлено
Может надо не 'PdMode', а "Pdmode" ?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.02.2008, 17:34
#13
Зойберг


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


А у меня нет SendCommand. Прочтиал в помощи, там такого тоже нет.
Цитата:
Может надо не 'PdMode', а "Pdmode" ?
Пробовал, регистр тут не при чём
Зойберг вне форума  
 
Непрочитано 28.02.2008, 16:10
#14
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А вот какую я нарыл инфу:
Я никак не мог правильно передать getpoint-у координаты точки из VBScript. Хоть и похоже на VBA, но не VBA.

Тогда я сдеал хитрость, запустил вот это и посмотрел, что вернется в Автокад и вот что я увидел:

Это программа, которая на VBScript-е формирует координаты точки и передает их
Код:
[Выделить все]
(setq svr (vlax-get-or-create-object "MSScriptControl.ScriptControl"))
(vlax-put-property svr "Language" "vbscript")
(vlax-invoke-method svr "AddCode" "
                                                Dim res(2) 
                                                res(0) = 100
                                                res(1) = 200
                                                res(2) = 0
                                                Function test3 () 
                                                msgbox  \"ggg\"
                                                test3 = res
                                                End Function
")
; И этим запускаем функцию
(vlax-invoke-method svr "eval" "test3")

Возвращает #<safearray...>
распаковываем
(vlax-safearray->list (vlax-invoke-method svr "eval" "test3"))
видим
(#<variant 2 100> #<variant 2 200> #<variant 2 0>)

Вот оно его есть и не хочет
Supermax вне форума  
 
Непрочитано 28.02.2008, 20:17
#15
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Да, или все крутые программисты данного форума решили меня байкотировать и взяли подписку друг с друга о не участии в темах с моим присутствием, или я стал задавать вопросы выше их уровня компетенции.
Чую заговор.
Supermax вне форума  
 
Непрочитано 28.02.2008, 23:18
#16
Кулик Алексей aka kpblc
Moderator

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


> VVA: В Delphi, по-моему, строки указываются одиночными кавычками.
> Зойберг: А если в коде сделать doc.GetVariable('pdmode') да и проанализировать возвращаемое значение? Чего там получится?
> Supermax : Лично для меня - уже да, выше уровня квалификации (в сторону: да и понимания, зачем все так усложнять - тоже ) Чур, без обид!
---
Добавлено:
> Зойберг: цитата из справки по методу SetVariable:
Цитата:
SetVariable Method

Sets the value of an AutoCAD system variable.

Signature
Код:
[Выделить все]
object.SetVariable Name, Value
Object : Document. The object or objects this method applies to.
Name : String; input-only. The name of the system variable to set.
Value : Variant; input-only
The new value for the specified system variable.
Remarks
When setting system variables, AutoCAD may require integers, text, or double values. Passing the wrong data type (for example, passing a variant of type double when an integer is required) will generate an error. The easiest way to avoid this is to use one of the Cxxx functions, such as CInt(), to explicitly type your data before passing it.

For a list of all AutoCAD system variables and their types, please refer toSystem Variables in the AutoCAD Command Reference.
И пример использования:
Код:
[Выделить все]
Sub Example_SetVariable()
    ' This example sets various system variables, each of
    ' a different data type.
    
    Dim sysVarName As String
    Dim sysVarData As Variant
    Dim DataType As Integer
    
    ' Set FILEDIA system variable (data type Integer) to 1. NOTE that
    ' you need to declare a variable as the data type of system variable,
    ' assign data to that variable and then make it variant type
    Dim intData As Integer
    sysVarName = "FILEDIA"
    intData = 1
    sysVarData = intData    ' Integer data
    ThisDrawing.SetVariable sysVarName, sysVarData
    
    ' Check the variable using GetVariable
    sysVarData = ThisDrawing.GetVariable(sysVarName)
    MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"
    
    ' Set DCTCUST system variable (data type String) to "My Custom Dictionary"
    Dim strData As String
    sysVarName = "DCTCUST"
    strData = "My Custom Dictionary"
    sysVarData = strData        ' String data
    ThisDrawing.SetVariable sysVarName, sysVarData
    
    ' Check the variable using GetVariable
    sysVarData = ThisDrawing.GetVariable(sysVarName)
    MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"
   
    ' Set CHAMFERA system variable (data type Double) to 1.5
    Dim dataDouble As Double
    sysVarName = "CHAMFERA"
    dataDouble = 1.5
    sysVarData = dataDouble ' Double data
    ThisDrawing.SetVariable sysVarName, sysVarData
    ' Check the variable using GetVariable
    sysVarData = ThisDrawing.GetVariable(sysVarName)
    MsgBox sysVarName & " = " & sysVarData, , "SetVariable Example"
   
    ' Set INSBASE system variable (data type array) to (1.0,1.0,0)
    Dim arrayData3D(0 To 2) As Double
    sysVarName = "INSBASE"
    arrayData3D(0) = 1#: arrayData3D(1) = 1#: arrayData3D(2) = 0
    sysVarData = arrayData3D    ' 3D array data
    ThisDrawing.SetVariable sysVarName, sysVarData
    ' Check the variable using GetVariable
    sysVarData = ThisDrawing.GetVariable(sysVarName)
    MsgBox sysVarName & " = " & sysVarData(0) & ", " & sysVarData(1) & ", " & sysVarData(2), , "SetVariable Example"
    
End Sub
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 28.02.2008 в 23:33.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCad и Delphi. Добавление точки

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
О создании темы (раздела) для новичков в AutoCAD. Profan Разное 110 23.10.2008 10:01
Литература по программированию на Delphi для AutoCAD Sokolru Программирование 6 30.03.2006 08:12
Delphi и AutoCAD Kulon Программирование 1 14.07.2005 15:42
Delphi and AutoCAD John Ch. Программирование 4 31.01.2004 13:58