Тема: Как узнать координаты точек привязки?

Здравствуйте! Вопрос такой:
Создаю селекшен (пока разговор про один размер) и хочу узнать координаты точек привязки.
Нашел, что это коды DXF ? 10 и 11. Но такая вот строчка программы почемуто не даёт
значений этих ячеек (возможно и даёт, но я их вынять не могу). Что я делаю не так?
gpCode(0) = 0
dataValue(0) = "DIMENSION"
groupCode = gpCode
dataCode = dataValue
ssetObj.SelectOnScreen groupCode, dataCode
Dim xdataOut As Variant
Dim xtypeOut As Variant
ssetObj.Item(0).GetXData "", xtypeOut, xdataOut

Re: Как узнать координаты точек привязки?

Ну что, где профессионалы то?! Хоть ченить напишите...

Re: Как узнать координаты точек привязки?

А что Вы хотите услышать? Метод GetXData извлекает расширенные данные из примитива. Причем здесь "координаты точек привязки"? Вы вообще откуда это взяли?

Re: Как узнать координаты точек привязки?

А для извлечения того, что Вы называете "координаты точек привязок" (если я правильно Вас понял) используются свойства ExtLine1Point и ExtLine2Point объекта DimAligned. Смотрите справку.

Re: Как узнать координаты точек привязки?

Дело в том, что как мне показалось, XDATA содержит все данные по объект и было бы неплохо с этим разобраться. Но метод GetXData позволяет вытащить только несколько свойств (для размера - это 5 штук). Может конечно в этих пяти как раз и закодированы все остальные, но вот меня интересует конкретно как вынять значение ячеек с номерами 10 и 11. Ведь насколько я понимаю, значения этих ячеек и для линии и для других объектов всегда характеризуют их координаты положения. На самом деле хотел я это использовать для создания функции выравнивания размерных линий на чертеже, когда по одному размеру ровняются все остальные. Может я выбрал не самый короткий путь, но занимаюсь VBA (как вообщемто и програмированием в целом три недели), отсюда вообщем то и такие вот вопросы...

Re: Как узнать координаты точек привязки?

Для DimAligned это понятно, а для объекта DimRotated?

Re: Как узнать координаты точек привязки?

> ssn
Не сочтите за бурчание сноба, но прежде чем пытаться программировать под АвтоКАД (на чем угодно), надо книжки приличные почитать, и справку. Тогда и вопросов таких не будет по определению.
Во-первых, за координаты всяких- разных точек у размеров отвечают не "коды DXF ? 10 и 11", а для каждого типа размера это свой код DXF из: 10, 13, 14, 15 (WCS) и 11, 12, 16 в (OCS). И "выдергивать" их лучше (да и правильнее) с помощью LISP, а на VBA нужно работать с объектной моделью АКАДа.
Во-вторых. XDATA (расширенные данные примитива) НЕ "содержит все данные по объекту", это "привязанные" к примитиву данные, ассоциированные с определенным приложением. Подробнее опять же в книжках или справке. Если говорить о размерах, то к ним автоматически привязываются расширенные данные, имеющие следующий вид:

1001-ACAD - имя приложения
1000-DSTYLE - текстовое значение
1002-{ - открывающая скобка (начало списка)
1070-40 - системная переменная DIMSCALE
1040-1 - значение
1002-} - закрывающая скобка (конец списка).

> Beer
Вот это вопрос интересный. В свойствах примитива типа AcDbRotatedDimension эти свойства отсутствуют. Может я плохо смотрел, может быть они "закопаны" в других свойствах. Надо разбираться. Но я хочу показать, что если в АКАДе что-то хочется сделать, то это практически всегда возможно. Не надо только зацикливаться на чем-то одном, в данном случае на VBA. Эти точки элементарно извлекаются с помощью LISP. Нижеследующий пример, конечно, это очень большое извращение. Но показывающее, на мой взгляд, как использовать возможности разных пакетов программирования.

Option Compare Text
Option Base 0
Option Explicit
Sub selectRotatedDimension()
Dim returnObj As AcadEntity
Dim temp, startPnt, endPnt, varCancel As Variant
Dim control As Boolean
On Error GoTo Error_Control
control = False
'Программа выполняется до тех пор, пока не выбран нужный примитив или не нажата клавиша ESC
Do Until control = True
    ThisDrawing.Utility.GetEntity returnObj, startPnt, vbCrLf & "Command: Выберите объект типа AcDbRotatedDimension:"
    If returnObj.ObjectName = "AcDbRotatedDimension" Then
        'В командную строку передается LISP-выражение, возвращающее первую точку в WCS (код DXF - 13)
        ThisDrawing.SendCommand ("(cdr (assoc 13 (entget (handent " & """" & returnObj.Handle & """" & "))))" & vbCr)
        temp = Mid(CStr(ThisDrawing.GetVariable("lastprompt")), 2, Len(CStr(ThisDrawing.GetVariable("lastprompt"))) - 2)
        'В переменную startPnt записывается массив с координатами первой точки
        startPnt = Split(temp, " ", , vbTextCompare)
        If IsArray(startPnt) Then
            MsgBox "Первая точка: " & startPnt(0) & ";" & startPnt(1) & ";" & startPnt(2)
        End If
        'В командную строку передается LISP-выражение, возвращающее вторую точку в WCS (код DXF - 14)
        ThisDrawing.SendCommand ("(cdr (assoc 14 (entget (handent " & """" & returnObj.Handle & """" & "))))" & vbCr)
        temp = Mid(CStr(ThisDrawing.GetVariable("lastprompt")), 2, Len(CStr(ThisDrawing.GetVariable("lastprompt"))) - 2)
        'В переменную endPnt записывается массив с координатами второй точки
        endPnt = Split(temp, " ", , vbTextCompare)
        If IsArray(endPnt) Then
            MsgBox "Вторая точка: " & endPnt(0) & ";" & endPnt(1) & ";" & endPnt(2)
        End If
        control = True
    Else
        MsgBox "Выбранный объект не является объектом типа AcDbRotatedDimension."
    End If
Loop
GoTo Exit_Here
Error_Control:
Select Case Err.Number
    Case -2147352567
        varCancel = ThisDrawing.GetVariable("LASTPROMPT")
        If InStr(1, varCancel, "*Cancel*") <> 0 Then
            ThisDrawing.Utility.Prompt "Выполнение программы прервано."
            Err.Clear
            Resume Exit_Here
        Else
            Err.Clear
            Resume
        End If
    Case -2145320928
        Err.Clear
        Resume Exit_Here
    Case Else
        MsgBox Err.Description & " " & Err.Number
        Err.Clear
        Resume Exit_Here
End Select
Exit_Here:
Set returnObj = Nothing
Set temp = Nothing
Set startPnt = Nothing
Set endPnt = Nothing
Set varCancel = Nothing
End Sub

Re: Как узнать координаты точек привязки?

Но всё же, ежели вернуться к моей конкретной задаче (выравнивание размеров по определённой линии) как это осуществить в VBA ? А книжки я конечно же почитал, только вот они все восновном про эксель а про акад почти ничего, хелпы это конечно хорошо, но там в эксаплах примеры довольно таки скудные...
И возвращаясь к dxf кодам, почему же тогда лиспом их вызвать их можно, а VBA получается нельзя?

Re: Как узнать координаты точек привязки?

> ssn
"почему же тогда лиспом их вызвать их можно, а VBA получается нельзя"
Потому, что VBA работает только с объектной моделью. С ее помощью можно сделать только то, что опубликовано в библиотеке типов.
На Visual Lisp можно работать и с объектной моделью, и с функциями AutoLisp, да еще разными методами. VBA подключили к AutoCAD  а) в виде реверанса перед Microsoft, б) чтобы отбрехиваться от упреков в отсутствии "вижуальных" средств в невижуальном Visual Lisp, в) чтобы огромная масса VB-программистов

думала

, что и они теперь могут программировать в AutoCAD. Конечно, могут, но когда доходит до решения серьезных задач, упираются в ограничения.

> bender
прав, когда пишет
"Не надо только зацикливаться на чем-то одном, в данном случае на VBA".
VBA имеет кое в чем серьезные преимущества перед Visual LISP, но их обычно как раз и не используют. Зато пытаются делать то, что легко реализуется в LISP. Без знания LISP в AutoCAD приверженцам любых других сред, включая VB, VBA, Delphi, VC++, не обойтись.

Re: Как узнать координаты точек привязки?

ssn пишет:

А книжки я конечно же почитал, только вот они все восновном про эксель а про акад почти ничего,

Я говорил не о книгах по программированию на VBA, а вообще про нормальные книги по АКАДу (например Н. Полещука). Потому что прежде чем программировать, надо нормально разбираться в самой программе (команды и их опции, DXF, объектная модель и т. п.).

хелпы это конечно хорошо, но там в эксаплах примеры довольно таки скудные...

Нормальные там примеры. Показывающее как раз то, что нужно. А не разжевывающие до состояния когда остается только проглотить.

И возвращаясь к dxf кодам, почему же тогда лиспом их вызвать их можно, а VBA получается нельзя?

Глубокоуважаемый Гуру уже ответил. Могу только еще раз за ним повторить: да, нельзя. Это разные языки программирования. LISP предназначен для обработки списковых структур (коими и являются коды DXF - пара параметр/значение) (и не только), а VBA - для работы с объектной моделью.

Но всё же, ежели вернуться к моей конкретной задаче (выравнивание размеров по определённой линии) как это осуществить в VBA?

Если нужно выравнять размерные линии, то оперируйте свойством TextPosition. Оно присутствует у линейных размеров всех типов.

Re: Как узнать координаты точек привязки?

ShaggyDoc пишет:

Потому, что VBA работает только с объектной моделью. С ее помощью можно сделать только то, что опубликовано в библиотеке типов.

Читается подтекст: "Не все они, гады ползучие, в этой объектной модели опубликовали!". Не хочу сказать, что я пишу чрезвычайно сложные программы (я вообще-то себя программистом не считаю), но в работе реальных затыков по этому поводу было наперечет. Причем через некоторое время оказывалось, что это я не совсем прав, а не разработчики.

Конечно, могут, но когда доходит до решения серьезных задач, упираются в ограничения.

По моему глубокому убеждению, дело не в VBA как таковом, а в том, что огромное количество людей начало писать программы для АКАДа толком в нем не разбираясь и не понимая, что это такое. Что это не Excel, не Word, и даже не Corel.

На Visual Lisp можно работать и с объектной моделью

Не буду настаивать на своем утверждении, дабы не ярить фанатов, но считаю, что здесь возможности Visual Lisp и рядом не стояли с VBA (или Delfi). Среда разработки, контекстная помощь, отладка, отлавливание и обработка ошибок и т. д. и т. п. А создание пользовательского интерфейса? Если бы он появился году в 89-90, то это было бы не круто, а оч-ч-чень круто. А в 98-99....
Когда я писал по поводу зацикливания, я ведь имел в виду не только VBA, но и, страшно сказать, сам LISP. Фанатизм - это всегда плохо, это добровольная кастрация. Он ведет только к узости мышления, зашоренности мозгов и к снобизму. И поэтому мне одинаково не понятны как люди программирующие без знания элементарных вещей, так и утверждающие, что "LISP - язык особенный. Это язык искусственного интеллекта."

Re: Как узнать координаты точек привязки?

> bender
>Читается подтекст: "Не все они, гады ползучие, в этой объектной модели опубликовали!".
Именно так. Не все. И приходится с этим сталкиваться. Хуже - в разных билдах одной версии имеются расхождения. При программировании в VBA это не так заметно, потому что имеются "предопределенные" объекты. Еще хуже бывает - ошибки в реализации не на уровне COM-интерфейсов, а в Си-шном коде. Просто в эти гадюшники мало кто заглядывает.
>"Среда разработки, контекстная помощь, отладка, отлавливание и обработка ошибок"
Полностью согласен! Со всем абзацем. "Visual" в отношении LISP просто жульнический рекламный трюк. Autodesk просто не смогла усовершенствовать "путем" VitalLisp, приобретенный у Basis Software.
>Когда я писал по поводу зацикливания, я ведь имел в виду не только VBA, но и, страшно сказать, сам LISP
И с этим согласен. Фанаты LISP принесли ему много вреда, когда стали утверждать про "искусственный" интеллект.  Он мог бы стать более распространенным. Когда-то на LISP писали приложения операционной системы ITS (Incompatible Timesharing System) для мини-компьютеров PDP-10.
Существует мнение, что ?перепиши хакеры из MIT, Стэнфорда и Карнеги-Меллонского университета ITS на LISP, вся история пошла бы в другую сторону, и открытыми системами мы называли бы, скорее всего, не потомков Unix, а потомков ITS?
Но развитие пошло иным путем.
LISP очень удобен для графических систем, подобных AutoCAD. Но, к сожалению, применяется только в нем (не имею ввиду самостоятельные клоны). Мне ведь тоже приходится писать на Basic, например для Mapinfo - там это стандартное средство. Насколько неудобно работать с графикой в императивном языке! Поэтому я всегда советую коллегам по Delphi - чертите не "дельфой", а "лиспом". А вот с офисными приложениями и реляционными БД удобнее работать на VBA, потому что он более соответствует модели офисных документов. Гипотетический "OfficeLisp" был бы хуже.
Но Autodesk сделала важнейшее - доступ из Visual Lisp к COM-серверам вообще, а не только к AutoCAD. Это позволяет решить и проблемы с интерфейсом, и работу с БД и многое другое. Мы уже почти не пишем диалогов на убогом DCL. Все это можно загонять в COM и делать в любой удобной среде - и Delphi, и VB ("большом"). В чем угодно.

Re: Как узнать координаты точек привязки?

> ShaggyDoc
Честно говоря приятно получить подтверждение своим мыслям от столь уважаемого человека (без всякой иронии). Спасибо.
Ну уж если у нас завязался такой светский разговор, позволю себе еще высказаться.
Под очень многими Вашими высказываниями я готов подписаться, с некоторыми готов согласиться, с некоторыми несогласен. Но некоторые вызывают у меня, так скажем, непонимание. В частности

Насколько неудобно работать с графикой в императивном языке!

Все примеры, приводимые Вами и другими, в подтверждение этих слов, вызывают у меня ну просто-таки умиление. "Нарисуем линию из точки с координатами....." и т. д. И потом говорится: "Сравните размеры программы на VBA (Delfi) и на LISP. Выводы делайте сами." Ну в такой постановке задачи - ответ очевиден с самого начала. Ну а если надо нарисовать не набор примитивов типа линия, дуга и т. п.(допустим так многими любимую форматку), а, скажем, табурет (трехмерный)? Ответ будет таким же? Лично я могу утверждать, что он по крайней мере не очевиден. Например, программа на VBA которая рисует моечную ванну (приблизительно такую, как у многих стоит дома) с разным количеством ячеек, переливами, рабочими поверхностями с ребрами, регулируемыми ножками, дополнительными полками, отбортовкой и т. п. насчитывает чуть более 40 тыс. символов. Половина из которых это VBA-шные свойства, методы и т. д. Если с ней еще поработать будет раза в полтора меньше. Что-то подобное, писанное года четыре назад на LISP, но проще, было, если не изменяет память, порядка 20 тыс. символов. Может быть я что-то не так понимаю в Вашей аргументации?

Re: Как узнать координаты точек привязки?

> bender
Мне тоже приятно общаться с человеком, который понимает суть вопроса и не зациклен на выбранной технологии.
По существу:
1. Работая в VB, VBA, Delphi можно обращаться только к объектной модели. В ActiveX Automation ограничен набор типов данных. Это не недостатки конкретных языков, а принцип COM. Общаться программы могут или через интерфейсы или через допустимые типы. Обращение к свойствам AutoCAD или документа (цвет экрана, например) просто и понятно. Тут проблем нет. А когда доходит до рисования или модификации объектов - все сложнее.
Необходимо, например, заранее рассчитать точки, преобразовать в массив требуемого типа и передать. Формирование массивов нелогично для графики - последовательность чисел, в которой точку могут означать и два, и три числа. При использовании (command вы можете передавть точки и двухмерные, и трехмерные. Но это полбеды.
2. В LISP можно передавать в аргументах функции результаты работы другой функции, не сохраняя их в переменных. Вложенность не регламентируется, причем данные могут быть любого типа. Это радикальное отличие на уровне языка.
3. В LISP можно передать в аргументе имя переменной или функции в виде 'Имя, причем само Имя может быть "вычислено". Это еще одно радикальное отличие. Да еще такая функция может на лету конструироваться и модифицироваться.
4. Можно ли на VBA (AutoCAD) вызвать функцию загруженную в память в другом приложении? Можно ли обмениваться данными между разными приложениями?
5. Можно ли на VBA создать аналог команды PLINE для интерактивного рисования трасс (c отменами, изменениями направления и т.п.)?  Можно ли такое приложение сделать в виде универсальной функции, в аргументах которой передавать имя функции, рисующей сегмент своими методам (разными для разных видов трасс)?
6. Можно ли в VBA, например, интерактивно вставлять в цикле блок, так чтобы его изображение всегда "висело" на курсоре? Да еще сделать это в виде одной единственной функции для всех "специальностей"?
Таких вопросов может быть много. Ответ один.
В AutoLISP тоже многого было нельзя. С внедрением ActiveX многое стало можно. Но не все. Например нельзя вызвать функцию из обычной DLL, что легко делает VB.
Мерять программы количеством символов бессмысленно. Их можно натолкать сколько угодно ненужных. Труднее с минимумом нужных.
Попробуйте переверните на VBA

    11 12 13
    21 22 23
    31 32 33

в вид

  11 21 31
  12 22 32
  13 23 33

Разумеется, с непостоянной размерностью по "Х" и "У".
Это не этюд, а реальная задача преобразования Recordset в человеческий вид
Код на LISP:

(defun trans_lst (lst)
 (apply 'mapcar (cons 'list lst))
)

Конечно, сделать можно и на VBA. Но с какими затратами и как потом применять в разных приложениях? Все включать в приложение?

Re: Как узнать координаты точек привязки?

> ShaggyDoc
Большое спасибо за ответ. Почти со всем, высказынным Вами, я согласен. Просто короткие замечания.
п.1.

А когда доходит до рисования или модификации объектов - все сложнее

Действительно, ограничения есть (например, изменение стиля MLINE или вопрос, с которого началась эта ветка). Но подавляющее количество примитивов с их свойствами все же описаны и, сл-но, и рисуются и модифицируются. Я понимаю, что "подавляющее" не есть все, и, конечно, это не есть хорошо.

Формирование массивов нелогично для графики

Конечно согласен. Но это наверное отличительная особенность мозгов - лично мне просто понятнее оперировать массивами, а не списками.
п. 2.
В рамках одного проекта можно. Правда через переменные.
п. 3.
Против правды не попрешь.
п. 4.

Можно ли на VBA (AutoCAD) вызвать функцию загруженную в память в другом приложении?

Нельзя.

Можно ли обмениваться данными между разными приложениями?

С трудом, но можно (например, через временные файлы).
п. 5.
Функцию то создать можно (правда это действительно нетривиальная задача), а вот с аргументами функции... п.п. 2-3.
п. 6.
Опять ни убавить, ни прибавить. Просто таки голая правда жизни.
По-поводу переворачивания массива - п. 5.
Если не все, то многое я и так знал. Цель моей, так сказать, "провокации" была в том, что, может быть, посетители этого раздела сайта почитают и задумаются о том, что такое АКАД, чем он отличается от того же Excela и ради чего, собственно, они в него залезли. Раз уж книжки не читают.
Еще раз большое спасибо за развернутый ответ.

Re: Как узнать координаты точек привязки?

Кстати можете сравнить, кому интересно. Это конечно "не вокал, а эскиз к вокалу", слепленный за пару минут. И конечно же

...как потом применять в разных приложениях? Все включать в приложение?

Option Explicit
Option Base 0
Sub test()
Dim arr1() As Long
Dim arr2() As Long
Dim str As String
Dim i, j As Long
ReDim arr1(0 To 2, 0 To 2) As Long
arr1(0, 0) = 11: arr1(0, 1) = 12: arr1(0, 2) = 13
arr1(1, 0) = 21: arr1(1, 1) = 22: arr1(1, 2) = 23
arr1(2, 0) = 31: arr1(2, 1) = 32: arr1(2, 2) = 33
ReDim arr2(0 To UBound(arr1, 2), 0 To UBound(arr1, 1)) As Long
For i = LBound(arr1, 2) To UBound(arr1, 2)
    For j = LBound(arr1, 1) To UBound(arr1, 1)
        arr2(i, j) = arr1(j, i)
    Next
Next
str = ""
For i = LBound(arr2, 1) To UBound(arr2, 1)
    For j = LBound(arr2, 2) To UBound(arr2, 2)
        str = str & arr2(i, j) & ":"
    Next
    str = Left(str, Len(str) - 1) & vbCrLf
Next
MsgBox str
End Sub

Re: Как узнать координаты точек привязки?

> bender
Да, обмен мнениями полезный. Многим стоит задуматься о возможностях разных инструментов.
Разумеется, VBA можно применять, и очень даже успешно, для решения многих отдельных задач. Но серьезную систему только на VBA не сделать. Многим это никогда не понадобится. Но аппетит растет во время еды...
Сначала человек покупает "Оку" и страшно доволен. Для себя хватает. Но он понимает, что "таксовать" на ней уже не получится - "струмент" не тот. Хоть один мужик переделал "Запорожец" в 6-метровый лимузин, "Линкольном" тот все равно не стал.
В отношении VBA не было бы претензий, если бы он включался в новый продукт с самого начала. AutoCAD много лет имел и LISP, и ADS, и ARX. И вдруг еще ЭТО. Явно, чтобы "дурить нашего (вернее, ихнего) брата". Но и наши люди на это попадаются.

Re: Как узнать координаты точек привязки?

Вообще тема ушла совершено не в ту степь, но интересно...
VBA нужен только для тех кто не знаком с "родными" языками приложения, а писать надо и сейчас (ну или кто кроме VB ничего не признает).

Re: Как узнать координаты точек привязки?

Кстати, есть очень класная серия продуктов для проектирования коммуникаций и дорог под названием MX, так вот под нее можно писать только на VB. Покрайней мере мне так сказали. После нового года будем разбираться  их объектной модели. Она достаточно оригинальна и сильно отличается от AutoCad, MicroStation, MS Office.

Re: Как узнать координаты точек привязки?

Наверно с самого начала я малость недоговорил, я не програмист, а конструктор и это конечно круто бацать свои приложения, которые потом рисуют всякого рода табуретки (пусть даже и параметричские), но все же для этого существуют другие 3D продукты (Inventor например, где при необходимости можно создать объект, а потом вставлять его направо и налево). Я же на данный момент пытался малость облегчить ежедневную работу, а глобальности пока что не требуется. Нам бы чё попроще, выноски там всякие, значёчки, обозначения по ГОСТ (например сварки) ну и тд и тп. Вероятно изночально перед нами стоят разные задачи и в этом то всё и дело. Если честно, то мне ещё ни разу не приходилось каким либо образом связывать данные из Акада с чем либо ещё... Зачем изобретать велосипед когда требуется лишь малость его подправить и поехал?! А про координаты текста (возвращаясь к задаче) мысль была, но у разных размеров привязка текста может быть разная, да и ориентация размера.... Но в любом случае спасибо за ответ, ещё конечно же (просто несомненно) у меня будут вопросы, вы уж отвечайте пож-ста....

Re: Как узнать координаты точек привязки?

Наверное, с самого начала надо попросить извинения у уважаемого SSN, за то, что в его ветке разговор отвлекся в сторону. Прошу прощения. Теперь по существу.

ssn пишет:

но все же для этого существуют другие 3D продукты (Inventor например, где при необходимости можно создать объект, а потом вставлять его направо и налево).

Супер. Просто супер... Правда, когда начинаешь работать конкретно (в Invertor, Mechanics, Solid Works и иже с ними)выясняется, что не все уж так и круто, как показалось. Кстати, тоже можно сказать об Architectural. Ну и потом, нарисовать, на самом деле, не так уж сложно. А что потом?Проектирование - это ведь не набор веселых картинок. Или
нет? А спецификации всякие разные, пояснительные записки и т. д. и т. п.?

Нам бы чё попроще, выноски там всякие, значёчки, обозначения по ГОСТ

Уважаемый SSN! Вот за этим Вы, честное слово, не туда зашли и не там копаете. Как раз вот для этого всего - LISP - ИДЕАЛЕН. И, что самое интересное, зная АКАД, освоить простые приемы программирования - это даже не задача, а так... Между двумя кружками пива.

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

Теперь по сути вопроса. Судя по предыдущему абзацу, размеры нарисованы не одним стилем (если я не прав, поправьте). Простите, но тогда задача не решаема в принципе. Для начала надо все размеры перевести в один размерный стиль. И тогда свойство TextPosition будет однозначно определять положение размерных линий у линейных размеров. Определяйте нужную Вам координату Х - и выравнивайте вертикальные размеры, Y - горизонтальные.

я не программист, а конструктор

Простите за навязчивость. Уж коли Вы взялись работать с какой-то программой, изучите ее возможности и доступные Вам, как конструктору, инструменты.

Beer пишет:

VBA нужен только для тех, кто не знаком с "родными" языками приложения, а писать надо и сейчас (ну или кто кроме VB ничего не признает).

Извините, категорически не могу согласиться. Если работаешь в какой-то области, нужно (на мой взгляд), в идеале, знать все. Понятно, что это идеал, который по определению не достижим. Но стремиться к нему надо. Хотя бы для того, чтобы с минимальными затратами (своими есессно) решать поставленные задачи.
И еще один вопрос, тесно примыкающий к предыдущему. В подавляющем количестве вопросов, задаваемом на этом, да и на других, форумах однозначно читается подтекст: "Мне вооще-то по жизни некогда, так что рассказали бы вы, по быстренькому, как мне решить вот такую проблему." .Уважаемый ShaggyDoc где-то такую психологию назвал, кажется, "психологией вечного студента". Может я не прав, свое мнение никому не навязываю. Но. Если бы я, пришедши после бурсы на работу, вел себя так же... У меня (в прошлой жизни) ставилась задача, и определялись сроки ее выполнения. И все, как ты ее будешь выполнять, где искать тветы - это твои проблемы, ты человек с верхним образованием. И, господа, поверьте лучший источник знаний это КНИГА. В конце концов, в умении работать с литературой и состоит верхнее образование. А в этой большой помойке (Интернет, а не данный сайт) ответы даются по принципу: "А я вот узнал, что..." или "А вот это я знаю, что вот так можно сделать..." Не серьезно это все, господа. Читайте книжки.

ShaggyDoc пишет:

Но аппетит растет во время еды

Я ведь не неофит. В АКАДе работаю, слава богу, с 88, где-то с того же времени программирую (понятно, что не Pascal, не на С  и на Basiq). К VBA я принюхивался оч-ч-ч-ень долго. Постепенно расширяя круг решаемых на нем задач. Сейчас 90%
задач решаю на VBA. НО! Когда Вы говорите, что: "... серьезную систему только на VBA не сделать", кто же станет спорить? А такую же систему только на LISP, или даже VLISP, можно сделать? И сколько народа станут с пеной у рта доказывать, что: "Да! Можно!".

AutoCAD много лет имел и LISP, и ADS, и ARX. И вдруг еще ЭТО. Явно, чтобы "дурить" нашего (вернее, ихнего) брата

Опять таки голая правда жизни. Правда вспоминается анекдот: "Чему радуется американец, купивший нелицензионную копию Windows? Тому, что он стал богаче на 200 $. А русский? Тому, что Билл Гейтс стал беднее на 200$." Да, мы такие. Ну а если серьезно, подоплека такая: "Ну и что вы будете делать, когда VBA уберут из АКАДа (а в этом, похоже, никто не сомневается)?" Ответ: работать так, как и до VBA. С новыми возможностями, в новах программах (Delfi?). Но ведь главное, чтобы до этого момента мозги не были убитыми. У меня, наверное, не будут. А у 99% процентов этого сайта? И не только этого раздела. Ведь зайти в раздел по программированию LISP и уши сворачиваются. Те же проблемы с "вечными студентами."
Извиняюсь за возможные грамматические ошибки. Вечер трудного дня, сами понимаете.

Re: Как узнать координаты точек привязки?

Ну не знаю, на сколько это правильно, но на данный момент времени схема получения чертежей такая (у меня конечно же): в инвенторе создаётся модель, далее в мханикале делаются отпечатки (проекции и всевозможные резы) и потом весь этот набор линий редактируется и образмеривается в акаде. Путь не самый короткий да и связи с моделью нет, но пока вроде как работает... Это про кучу всяких 3D програм...
А теперь ещё вопрос, ежели можно:
А вот этот самый макрос, написанный например мной и живущий в конкретном файле, он не имеет выхода так скажем наружу, т.е. права жить без файла Акада (это я про компилятор...), как в Лиспе? Как Вы используете эти  макросы, загружаете параллельно несколько файлов или может ещё как хитро?

Re: Как узнать координаты точек привязки?

ssn пишет:

А вот этот самый макрос, написанный например мной и живущий в конкретном файле...

А Вы что присоединяете свой к проект к конкретному файлу? Не надо так делать. Сохраняете свой проект в какую-нибудь папку. Запускаете _-vbarun С:/МояПапка/МойПроект.dvb!МойМодуль.МояФункция , Где-то тут об этом уже говорилось.

Re: Как узнать координаты точек привязки?

Т.е для вызова макроса я так понимаю есть кнопочка, которая подгружает отдельный модуль из конкретной папочки...
Но ведь в таком случае этот макрос будет работать на отдельно взятой машине, т.е. не будет трансфортабельным, вроде как не совсем желательно...
И ещё вопрос не совсем по теме, но давно интересующий: Что происходит при возникновении ошибки? Ситуация такая: в цикле использую возникновение ошибки для дальнейшего разветвления программы и получается, что одна и таже ошибка может случаться только один раз, в смысле, при повторном выполнении этого же цикла, на ошибке, в первый раз прошедшей нормально, происходит переполнение чего то там, не знаю чего... Может информация об проишедших ошибках хранится какойнить переменной, которую можно и нужно обнулять или что то вроде того...
На данный момент решил это с помощью нового обращения  к функции (может тут то и обнуляются какие то данные...)
Наверно малость непонятно получилось...

Re: Как узнать координаты точек привязки?

Всем привет! Приятно было читать эту ветку. такие "монстры" как bender и ShaggyDoc доставили мне массу удовольствия. И у меня вопрос, конкретно к каждому из них. Может не в тему но ... Я не из тех, кого Вы называете  "вечными студентами". Я сам лазил и читал "хелпы", разбирал примеры. Но на этот вопрос ответа не нашел. При рендеринге мы назначаем конкретному солиду конкретный материал из конкретной библиотеки материалов. Как запустив прогу на Lisp (на VBA это точно не получится) получить информацию о том, какой материал назначен для рендеринга солиду и назначен ли он (материал)? Если будет пример, будет просто здорово. Спасибо.