Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» AutoCAD VBA/LISP

Автор: Anton T
Дата сообщения: 03.08.2006 11:51
Обсуждаем вопросы только по AutoCAD VBA/LISP
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.


Рекомендуется к прочтению:
AfraLisp.net - полный справочний VBA/LISP на английском языке и примеры.
Сайт пользователей САПР под редакцией Виктора Ткаченко
AutoCAD и Проектирование
Первые шаги с VBA на AutoCAD]

Примеры:
Программирование AutoCAD 200x на ActiveDwg - English

Ссылки и другие ресурсы:
VBA for AutoCAD - English
Автор: Anton T
Дата сообщения: 27.06.2007 08:42
Почему AutoCAD 2006(русская версия) не работает текст по дуги?
Вот такой код:

Код:
(defun rtd (a) (* a (/ 180 pi))) ; radians to degrees

(defun getarc (/ no_arc e0 e1)
(setq no_arc T)
(while no_arc
(if (setq e0 (entsel "\nSelect arc: "))
(if (= (cdr (assoc 0 (setq e1 (entget (car e0))))) "ARC")
(setq no_arc nil)
(princ (strcat (cdr (assoc 0 e1)) ", Not an arc."))
) ; end IF
(princ " No object found.")
) ; end IF
) ; end WHILE
(setq c1 (cdr (assoc 10 e1)) ; center point
r1 (cdr (assoc 40 e1)) ; radius
a0 (cdr (assoc 50 e1)) ; start arc angle
a1 (cdr (assoc 51 e1)) ; end arc angle
i1 (if (> a1 a0) ; included angle
(- a1 a0)
(+ a1 (- (* pi 2) a0))
) ; end IF
p1 (osnap (cadr e0) "end") ; start point pick
p2 (polar c1 a1 r1) ; end point arc
) ; end SETQ
) ; end DEFUN

(defun getset (/ h1 t1 n1 a2)
(setq h1 ; check current text style height
(if (zerop (cdr (assoc 40 (tblsearch "style" (getvar "textstyle")))))
(getdist p1 "\nHeight: ") ; text height
nil ; height defined by STYLE
) ; end IF
t1 (getstring T "\nText: ") ; text string
n1 1 ; counter
a2 (/ i1 (1- (strlen t1))) ; angle increment
) ; end SETQ
(if (< (distance p1 p2) 1.0E-8) ; clockwise?
(setq o1 '-) ; clockwise
(setq o1 '+ ; counter-clockwise
a1 a0
) ; end SETQ
) ; end IF
(setvar "cmdecho" 0) ; suppress command echo
(setvar "highlight" 0) ; suppress hightlighting
(setvar "blipmode" 0) ; suppress blips
(repeat (strlen t1) ; for each character
(command "text" "c" p1) ; TEXT command
(if h1 (command h1))
(command ((eval o1) (rtd a1) 90) (substr t1 n1 1))
(setq a1 ((eval o1) a1 a2) ; increment angle
n1 (1+ n1) ; increment counter
p1 (polar c1 a1 r1) ; increment text point
) ; end SETQ
) ; end REPEAT
(setvar "cmdecho" 1) ; enable command echo
(setvar "highlight" 1) ; enable hightlighting
(setvar "blipmode" 1) ; enable blips
) ; end DEFUN

(defun c:atext()
(getarc) ; get the arc
(getset) ; get the settings and draw text
(prin1) ; quiet exit
) ; end DEFUN
Автор: Anton T
Дата сообщения: 29.06.2007 15:16
[more]Уже исправлена

Код: (defun rtd (a) (* a (/ 180 pi))) ; radians to degrees

(defun getarc (/ no_arc e0 e1)
(setq no_arc T)
(while no_arc
(if (setq e0 (entsel "\nSelect arc: "))
(if (= (cdr (assoc 0 (setq e1 (entget (car e0))))) "ARC")
(setq no_arc nil)
(princ (strcat (cdr (assoc 0 e1)) ", Not an arc."))
) ; end IF
(princ " No object found.")
) ; end IF
) ; end WHILE
(setq c1 (cdr (assoc 10 e1)) ; center point
r1 (cdr (assoc 40 e1)) ; radius
a0 (cdr (assoc 50 e1)) ; start arc angle
a1 (cdr (assoc 51 e1)) ; end arc angle
i1 (if (> a1 a0) ; included angle
(- a1 a0)
(+ a1 (- (* pi 2) a0))
) ; end IF
p1 (osnap (cadr e0) "_end") ; start point pick
p2 (polar c1 a1 r1) ; end point arc
) ; end SETQ
) ; end DEFUN

(defun getset (/ h1 t1 n1 a2 _ce _hl _bm)
(setq h1 ; check current text style height
(if (zerop (cdr (assoc 40 (tblsearch "style" (getvar "textstyle")))))
(getdist p1 "\nHeight: ") ; text height
nil ; height defined by STYLE
) ; end IF
t1 (getstring T "\nText: ") ; text string
n1 1 ; counter
a2 (/ i1 (1- (strlen t1))) ; angle increment
) ; end SETQ
(if (< (distance p1 p2) 1.0E-8) ; clockwise?
(setq o1 ' ; clockwise
(setq o1 '+ ; counter-clockwise
a1 a0
) ; end SETQ
) ; end IF
(setq _ce (getvar "cmdecho"))
(setq _hl (getvar "highlight"))
(setq _bm (getvar "blipmode"))
(setvar "cmdecho" 0) ; suppress command echo
(setvar "highlight" 0) ; suppress hightlighting
(setvar "blipmode" 0) ; suppress blips
(repeat (strlen t1) ; for each character
(command "_text" "_c" "_none" p1) ; TEXT command
(if h1 (command h1))
(command ((eval o1) (rtd a1) 90) (substr t1 n1 1))
(setq a1 ((eval o1) a1 a2) ; increment angle
n1 (1+ n1) ; increment counter
p1 (polar c1 a1 r1) ; increment text point
) ; end SETQ
) ; end REPEAT
(setvar "cmdecho" _ce) ; enable command echo
(setvar "highlight" _hl) ; enable hightlighting
(setvar "blipmode" _bm) ; enable blips
) ; end DEFUN

(defun c:atext()
(princ "\n *** Draws text on arcs ***") ; banner
(getarc) ; get the arc
(getset) ; get the settings and draw text
(prin1) ; quiet exit
)
Автор: ssv22
Дата сообщения: 14.12.2008 22:31
Вопрос, можно сказать похожий: понадобилась небольшая прога ддля ACAD`a на VB. И вот не иог найти как записать макрос VBA, при выполнении интересующих меня действий!
Ведь почти во всех приложениях, где используется VBA, есть такое средство!
В основном я пишу для SoidWorks`a.
Но пробовал и MSОффис и Corel ...
Ведь удобно-же: вкл. Запись макроса, выполнил какле-то действие, посмотрел макрос в режиме отладки и все понятно становится...

PS. ACAD2007
Автор: Anton T
Дата сообщения: 15.12.2008 09:41
ssv22

Цитата:
И вот не иог найти как записать макрос VBA, при выполнении интересующих меня действий!
Увы нет...
Автор: ssv22
Дата сообщения: 15.12.2008 10:07

Цитата:
ssv22

Цитата:И вот не иог найти как записать макрос VBA, при выполнении интересующих меня действий!
Увы нет...


Это печально
Автор: kolapap
Дата сообщения: 12.04.2009 18:41
(defun prof ( / dcl_id all dx dy)
(alert "\nЖдите.. Программа загружается …")
(setq dcl_id (load_dialog "C:\\Program Files\\AutoCAD 2009\\AcadLsp\\St_prof\\prof.dcl"))
(new_dialog "prof" dcl_id)
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "( insertprof)")
; Имена изображений
(setq all
(list "001" "002" ))
(start_list "names")
(mapcar 'add_list all)
(end_list)
; Отметка первого в списке имени
(set_tile "names" "0")
; Размеры левого графического элемента
(setq dx (dimx_tile "sld1") dy (dimy_tile "sld1"))
; Загрузка первого слайда
(start_image "sld1")
(slide_image 0 0 dx dy "My(001)")
(end_image)
; Обработка выбора имени в списке
(action_tile "names" "(change_s $value all dx dy)")
(start_dialog)
(unload_dialog dcl_id)
); defun slide
; Функция при нажатии на ОК!
(defun insertprof()
(alert "Кнопка ОК!")
(setvar "CMDECHO" 0)
(setq old_osmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(command "_-INSERT" "C:\\Program Files\AutoCAD 2009\AcadLsp\St_prof\Block\001")
(alert "Фнкция вставки")
(done_dialog 0)
);
; Функция смены слайда
(defun change_s (sn nlist x y / i name)
(setq i (atoi sn) name (nth i nlist))
; Замена слайда
(start_image "sld1")
(fill_image 0 0 x y -2)
(slide_image 0 0 x y (strcat "My(" name ")"))
(end_image)
);

При изпользовании _-insert все зависает???
В чом ошибка?
Автор: NoLacIPa
Дата сообщения: 11.11.2009 17:29
Доброго времени суток.

Заранее сорри, если тему не туда вставил.

Описание проблемы:

есть пользовательсякая форма встроенная в документ АвтоКад 2005, на ней имееться ТекстБокс1. Я никогда не морочил себе голову и запускал ее из отладки и делал, что мне нужно. А теперь надо шефу показать и нужно чтоб при открытии данного документа форма выскакивала автоматически. Я когда то еще давно пользовал ВБА для Excel ну и по аналогии решил сделать так:
в ThisDrawing вставил код

Private Sub AcadDocument_Activate()

UserForm1.Show

End Sub

Форма грузиться, но фокус на ТекстБокс не удаеться перевести (тоесть туда писать ни чего нельзя). Фокус передаеться либо в строку команд, либо вообще хрен знает куда. Я своим скудным умом думаю это из-за того что не все модули загружены... Вот что делать? Я уже чем только не спикулировал. Подкиньте идей, кто разбираеться...
Автор: dneprcomp
Дата сообщения: 12.11.2009 19:16
NoLacIPa
И зачем же по два раза спрашивать? Уже ответили в
http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=10739#1
Автор: PrWork1
Дата сообщения: 12.11.2009 22:09
kolapap
(command "_-INSERT" "C:\\Program Files\AutoCAD 2009\AcadLsp\St_prof\Block\001")

Путь не верно; нужно снабдить вызов сомманд pause Для всех вводов пользователя;
или проверять в цикле сист.перем . CMDACTIVE;
лучше сначала закрыть диалог , а потом вствлять
Автор: andrej2005
Дата сообщения: 03.04.2010 09:38
Привет! С помощью процедуры FileProcessing добавляю в чертеже новый атрибут в блоках "tab_kab4", но его не видно. Как с этим бороться?

Public Sub FileProcessing(MainDoc As AxDbDocument)
Dim MS As AcadModelSpace
Set MS = MainDoc.ModelSpace
Dim i As Integer
Dim blokObj As AcadBlock
Dim attributeObj As AcadAttribute
Dim height As Double
Dim mode As Long
Dim prompt As String
Dim insertionPoint(0 To 2) As Double
Dim tag As String
Dim value As String
    
For i = 0 To MainDoc.Blocks.count
Set blokObj = MainDoc.Blocks.Item(i)
If blokObj.Name = "tab_kab4" Then
' Define the attribute definition
height = 1#
mode = acAttributeModeVerify
prompt = "New Prompt"
insertionPoint(0) = 5#: insertionPoint(1) = 5#: insertionPoint(2) = 0
tag = "NEW_TAG"
value = "New Value"
' Create the attribute definition object in model space
Set attributeObj = MS.AddAttribute(height, mode, prompt, insertionPoint, tag, value)
ZoomAll
End If
Next i
End Sub
Автор: Alexikit
Дата сообщения: 05.04.2010 11:22
andrej2005
Честно говоря давно не програмировала под ACAD, но у Вас нигде не вижу обновления, т.е функции object.Update
Автор: andrej2005
Дата сообщения: 09.04.2010 22:53
Alexikit

object.Update не помогает.
Автор: Alexikit
Дата сообщения: 12.04.2010 11:41
andrej2005
атрибут всеже наверно надо добавлять блоку.
Т.е
Set attributeObj = blokObj.AddAttribute(height, mode, prompt, insertionPoint, tag, value)
Автор: andrej2005
Дата сообщения: 12.04.2010 12:54
Правильное замечание, но я эту ошибку исправил давно, все равно не помогает. Перевел всю кухню на библиотеку AutoCad и атрибуты синхронизирую командой _attsync. Пока только так, другого решения не вижу.
Автор: yakuleb
Дата сообщения: 11.01.2011 16:09
Нужен учебник по программированию для автокад 2009 на VBA...
На русском языке есть что нибудь?
Автор: Rakh
Дата сообщения: 28.05.2011 17:56
Странная работа VBA в Autocad 2011.
Поставил VBA (autocad2011vbaenabler64), загрузил проект, опробованный в Autocad 2005. Работает (если это можно так назвать), но… Появляющееся окно диалога (UserForm) неактивно. Для каждого элемента управления нужно два щелчка мышью: первый активирует окно, второй – элемент управления (окно снова неактивно). С клавиатурой еще интереснее: надо щелкнуть в пределах окна, потом по рамке окна, после этого может сработать клавиша клавиатуры.
Может, кто знает, в чем заковыка.
Автор: PrWork1
Дата сообщения: 09.07.2011 22:43
yakuleb
В шапке есть "Первые шаги... "
ТАм для 2000, но для изучения разницы вообще не будет.
Автор: Kirpix
Дата сообщения: 10.07.2011 15:55
Я в ACAD только 3D-ки простенькие рисовал в свое время... вот с построением по точкам у меня плохо дело шло, так и не научился строить твердые фигуры.
Автор: PrWork1
Дата сообщения: 11.07.2011 07:56
Kirpix
А какой у Вас вопрос?
Как строить тела?
Автор: Timoharis
Дата сообщения: 27.09.2011 04:44
ДОбрый день! Вопрос по Autocad 2009.
Задача: нужно ограничить вводимое пользователем количество символов в блоке до 40.
1. Блок входит в уже разработанную стандартную рамку А1.
2. Enhanced Attribute Editor показывает:
2.1 Block: A1-title
2.2 Tag: TITLE1 Prompt: (English) TITLE LINE 1 Value: FLUBBER MITIGATION PROJECT
TITLE2..Prompt: (Russian) TITLE LINE 2 Value: ПРОЕКТ СНИЖЕНИЯ НЕУДАЧ
TITLE6
Модель объектов показывает что до атрибута то можно добраться через блок или modelspace. Но как добраться к значениям тагов (возможно это и не значения тагов), чтобы можно было запрограммировать событие по ограничению в 40 символов?
Спасибо!
Автор: ferias
Дата сообщения: 11.12.2011 00:50
Всем привет! Вопрос по программированию в VBA
есть 3DSolid (скажем мебельная плита определённой длины, ширины и толщины. Срезанная под любым углом с торца, просверленные отверстия, и т.д. и т.п.) который к World UCS лежит под произвольным углом. Хотелось бы узнать «контейнер» 3DSolid, только по отношению самой большой плоскости 3DSolid-а, а не по отношению к WorldUCS.

Решение вижу следующее:
- создаю новый слой
- копирую 3DSolid в новый слой, делая новый слой активным
- разбиваю 3DSolid на Region-и
- нахожу самый большой Region по площади в активном слое
- разбиваю этот Region на линии
- нахожу самые две самые длинные линии в активном слое
- привязываю UCS к этим линиям
- вырезаю первоначальный 3DSolid
- делаю активным World UCS
- вставляю вырезаемый объект
- используя функцию .GetBoundingBox узнаю размеры

Первая проблема:
- поскольку ThisDrawing.ModelSpace.Item(....) не поддерживает команду Explode, пытаюсь реализовать средствами ThisDrawing.SendCommand “_explode” & vbCr

Вопрос: как передать ThisDrawing.ModelSpace.Item(....) в ThisDrawing.SendCommand “_explode” & vbCr
Автор: seregadushka
Дата сообщения: 21.04.2012 22:03
гаспада, вопрос в том, что бы расчеты делать в Excel , а результаты выводить в AutoCAD.

Это 5 связей ( это в примере, а в реальном проекте их около 200) с файлом file1.xlsx, полученные :
"Правка-Специальная вставка-Вставить связь-ЛистExcel"

Они видны в "Правка-Связи"

Какой LISP-командой перенаправить эти связи на file2.xlsx ?

Эти файлы лежат в разных папках, поэтому очень желательно рассматривать имя файла как полный путь:
path1/file1.xlsx
path2/file2.xlsx

Файлы по структуре одинаковые, надо просто поменять путь и имя.
Спасибо.
Я уже поднимал этот вопрос на других форумах, судя по ненужным советам все удалить и сделать по-другому, эта простая на первый взгляд задача НЕРЕШАЕМА, ни макросам , ни LISP. Неужели это правда ?
вот вложение, чтобы было легче. Спасибо
http://kondi.na.by/files/link.zip
Автор: hwarang3
Дата сообщения: 23.04.2012 09:40
Добрый день!
Подскажите, пожалуйста в следующем вопросе.
Импортирую в Autocad чертеж из другой программы (Компас). Типы, цвет, толщина линий у примитивов меня не устраивают. Кроме того, некоторые объекты вставляются блоками. Напр., у основной линии выставлены свойства:цвет - 0,0,255, тип линии - K5LT_BASIC, вес линии - 0,6 мм. Хотел написать макрос для кнопки, выполняющий следующую последовательность действий: Выделить все->взорвать->Выделить все->Быстрый выбор->По типу линии (напр., "K5LT_BASIС"). Выделенный набор переместить в слой "Основная", свойства поменять цвет - по слою, тип линии - по слою, вес линии - по слою. Дошел до пункта "Быстрый выбор" (диалоговое окно) и застопорился. Можно ли как-то передать параметры выбора или может быть есть какой-нибудь др. способ перебрать объекты на чертеже по конкретному свойству (возможно, использовать LISP?).
Автор: Begimot441
Дата сообщения: 28.12.2013 11:48
Друзья, помогите, плиз!
Не могу отыскать в VBA, как получить в макросе те объекты, которые выбраны (подсвечены) ДО запуска макроса.
Спасибо!
Автор: PrWork1
Дата сообщения: 20.02.2014 19:32
Если ещё нужно...

За это отвечает
AcadDocument.PickfirstSelectionSet

Добавлено:
Если ещё нужно...

За это отвечает
AcadDocument.PickfirstSelectionSet
Автор: Laziz001
Дата сообщения: 03.04.2014 17:32
Нужен программист на lisp autocad, желательно с Санкт-Петербурга. о цене договоримся
Laziz@mail.ru

Страницы: 1

Предыдущая тема: Delphi: SelectDirectory() доп. фнкц. в виде создать катало


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.