Перейти к содержанию
swell{d}

Автоматизация работы в nanoCAD с помощью Visual Basic For Applications

Рекомендуемые сообщения

В этой статье мы рассмотрим один из вариантов автоматизации работы проектировщиков в САПР nanoCAD, позволяющий в значительной степени использовать параметризацию построений и значительно сокращать сроки выполнения различных задач.

 

На этой основе разработана программа для автоматизации построения развёрток монолитных железобетонных стен:

http://www.youtube.com/watch?v=0F_EozaZ4DM&feature=youtu.be

Fordewind.pdf

Изменено пользователем swell{d}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу повторить Ваш проект.

С примитивами более или менее разобрался.

Вопрос: как сделать блок из примитивов? Что бы генерировался сразу блоком? (С помощью каких команд: задать точку привязки)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Создаём блок:

 

Sub rdv_kr() 'Создаём блок каркаса КР

On Error GoTo ErrorHandler

kr = "name"

Dim tmp_block As IAcadBlock

Set tmp_block = ThisDrawing.blocks.item(kr)

Exit Sub 'Выходим из процедуры, чтобы не попасть в обработчик

ErrorHandler:

Select Case Err.Number

Case -2145386470 'если блока нет

ThisDrawing.Preferences.LineWeight = acLnWtByBlock

 

Dim pt1(2) As Double, pt2(2) As Double

Dim block As IAcadBlock, obj As AcadObject

Set block = ThisDrawing.blocks.Add(pt1, kr)

 

pt1(1) = -(tsten / 2 - 40)

pt2(1) = tsten / 2 - 40

Set obj = block.AddLine(pt1, pt2)

'obj.LineWeight = -2

obj.layer = "КЖ_арматура элементов"

 

pt1(0) = 10

pt1(1) = -(tsten / 2 - 60)

Set obj = block.AddCircle(pt1, 10)

'obj.LineWeight = -2

obj.layer = "КЖ_арматура элементов"

 

pt1(1) = tsten / 2 - 60

Set obj = block.AddCircle(pt1, 10)

'obj.LineWeight = -2

obj.layer = "КЖ_арматура элементов"

 

ThisDrawing.Preferences.LineWeight = acLnWtByLayer

End Select

End Sub

 

Вставляем блок:

 

Dim obj As AcadObject

Set obj = ms.InsertBlock(pt1, "name", 1, 1, 1, 0)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

А теперь я попробую разобраться, во всем этом

 

Создаём блок:

 

Sub rdv_kr() 'Создаём блок каркаса КР

On Error GoTo ErrorHandler 'Это я так понимаю, включение какого-то обработчика ошибок?

kr = "name" 'Задание переменной типа "String", т.е. Option Explicit - не включен?

Dim tmp_block As IAcadBlock 'Объявление переменной типа блок

Set tmp_block = ThisDrawing.blocks.item(kr) 'Вот здесь непонятно: Мы рисуем блок с названием kr = "name"?

Exit Sub 'Выходим из процедуры, чтобы не попасть в обработчик

ErrorHandler: 'Сюда перешли при возникновении ошибки?

Select Case Err.Number 'перебор номеров ошибок

Case -2145386470 'если блока нет 'если номер ошибки =-2145386470

ThisDrawing.Preferences.LineWeight = acLnWtByBlock 'то рисуем (пишем) что-то? Описание acLnWtByBlock не нашел. Или присваиваем вновь рисуемым линиям свойства толщины "по блоку"? Это действие выполняется, если номер ошибки =-2145386470?

 

Dim pt1(2) As Double, pt2(2) As Double 'Рисуем блок с именем kr = "name" и точкой привязки pt1 (заданной ранее?)

Dim block As IAcadBlock, obj As AcadObject

Set block = ThisDrawing.blocks.Add(pt1, kr)

 

pt1(1) = -(tsten / 2 - 40) 'Здесь вообще ничего не понял: tsten - это переменная? А почему меняется только одна координата? Или pt1(1) и pt1(2) это разные переменные?

pt2(1) = tsten / 2 - 40 'pt2(2) и pt2(2) - это разные переменные?

Set obj = block.AddLine(pt1, pt2) 'Добавляем в блок линию с координатами? Но, насколько я понял, pt1(1) и pt2(1) имеют по одному значению, а не по два?

'obj.LineWeight = -2 'Толщина линии -2? Это как так? А почему не acLnWt013? Отсюда: _http:/_/vbamodel.narod.ru/AutoCAD/idh_lineweight.htm

obj.layer = "КЖ_арматура элементов" 'Задание слоя объекта. Непонятно что есть "obj"?

 

'Здесь, я так понимаю, рисуется другой объект в своем слое

pt1(0) = 10

pt1(1) = -(tsten / 2 - 60)

Set obj = block.AddCircle(pt1, 10)

'obj.LineWeight = -2

obj.layer = "КЖ_арматура элементов"

 

'И здесь тоже рисуется другой объект в своем слое

pt1(1) = tsten / 2 - 60

Set obj = block.AddCircle(pt1, 10)

'obj.LineWeight = -2

obj.layer = "КЖ_арматура элементов"

 

ThisDrawing.Preferences.LineWeight = acLnWtByLayer 'присваиваем вновь рисуемым линиям свойства толщины "по слою"?

End Select 'Закончили перебор

End Sub 'Конец

 

Вставляем блок:

 

Dim obj As AcadObject 'Понял: obj - название переменной типа "блок"

Set obj = ms.InsertBlock(pt1, "name", 1, 1, 1, 0) 'ms.InsertBlock - что означает ms? Первый параметр - координаты точки привязки (или вставки?) блока, второй - имя, а остальные?

 

Заранее прошу прощения, за, может, идиотские вопросы.

Но в программировании я полный нуль, и то если себе не льщу )))

Просто очень нужно сделать одну вещь, а кроме меня - некому.

Если есть справочник по VBA с полным набором команд и параметров которые они могут принимать буду признателен, если поделитесь ссылкой.

Изменено пользователем Lion2032

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

А теперь я попробую разобраться, во всем этом

 

Создаём блок:

 

Sub rdv_kr() 'Создаём блок каркаса КР

On Error GoTo ErrorHandler 'Это я так понимаю, включение какого-то обработчика ошибок? Да

kr = "name" 'Задание переменной типа "String", т.е. Option Explicit - не включен? Включён всегда. Глобальная переменная

Dim tmp_block As IAcadBlock 'Объявление переменной типа блок

Set tmp_block = ThisDrawing.blocks.item(kr) 'Вот здесь непонятно: Мы рисуем блок с названием kr = "name"? Это говнокод =) Этой строкой я пытаюсь привязать к переменной tmp_block блок "name". Если он существует, то следующей строкой выходим из процедуры создания блока. Если не существует, то срабатывает ошибка -2145386470, которую мы чуть ниже и обрабатываем. Сделано это для того, чтобы при многократном запуске программы в один и тот же существующий блок не рисовались примитивы поверх уже отрисованных. Как сделать по другому - я не придумал =)

Exit Sub 'Выходим из процедуры, чтобы не попасть в обработчик

ErrorHandler: 'Сюда перешли при возникновении ошибки? Да. Любой ошибки

Select Case Err.Number 'перебор номеров ошибок

Case -2145386470 'если блока нет 'если номер ошибки =-2145386470 Да. Эта ошибка, если блока с таким именем не существует. Тогда - создаём его.

ThisDrawing.Preferences.LineWeight = acLnWtByBlock 'то рисуем (пишем) что-то? Описание acLnWtByBlock не нашел. Или присваиваем вновь рисуемым линиям свойства толщины "по блоку"? Это действие выполняется, если номер ошибки =-2145386470? Всё, что делается до EndSub - обработчик ошибки. Здесь просто ставим по умолчанию тип линии - по блоку.

 

Dim pt1(2) As Double, pt2(2) As Double 'Рисуем блок с именем kr = "name" и точкой привязки pt1 (заданной ранее?) нет, pt1 и pt2 только что создали. Это два массива, в каждом по 3 элемента: 0,1,2.

Dim block As IAcadBlock, obj As AcadObject

Set block = ThisDrawing.blocks.Add(pt1, kr) Создаём новый блок "name". Точка вставки у блока получается 0,0,0 т.к. переменные pt только что созданы и пока пустые. Все дальнейшие постраения отсчитываются от точки вставки (это как начало координат для примитивов блока).

 

pt1(1) = -(tsten / 2 - 40) 'Здесь вообще ничего не понял: tsten - это переменная? А почему меняется только одна координата? Или pt1(1) и pt1(2) это разные переменные? Блин, это вырванный кусок кода из программы на 3000+ строк =). Я просто поленился её адаптировать. tsten - глобальная переменная.

pt2(1) = tsten / 2 - 40 'pt2(2) и pt2(2) - это разные переменные? Две точки. Два массива pt1 и pt2. У каждой точки по три координаты x y z, соответственно pt1(0), pt1(1) и pt1(2) для pt1 и аналогично для pt2. Если переменная объявлена, то по умолчанию все элементы массива - ноль. Те, которые не ноль, я задаю.

Set obj = block.AddLine(pt1, pt2) 'Добавляем в блок линию с координатами? Но, насколько я понял, pt1(1) и pt2(1) имеют по одному значению, а не по два? Да. По три значения, см. выше. Всё тоже самое, что и modelspace, только вместо ThisDrawing.modelspace пишем block (объект, который создали выше).

'obj.LineWeight = -2 'Толщина линии -2? Это как так? А почему не acLnWt013? Отсюда: _http:/_/vbamodel.narod.ru/AutoCAD/idh_lineweight.htm -2 это кажется по блоку.

obj.layer = "КЖ_арматура элементов" 'Задание слоя объекта. Непонятно что есть "obj"? Объект - линия, которую создали двумя строками выше и строкой выше назначили ей тощину "по блоку". В этой строке назначили ей слой.

 

'Здесь, я так понимаю, рисуется другой объект в своем слое

pt1(0) = 10

pt1(1) = -(tsten / 2 - 60)

Set obj = block.AddCircle(pt1, 10)

'obj.LineWeight = -2

obj.layer = "КЖ_арматура элементов" Рисуем кружок

 

'И здесь тоже рисуется другой объект в своем слое

pt1(1) = tsten / 2 - 60

Set obj = block.AddCircle(pt1, 10)

'obj.LineWeight = -2

obj.layer = "КЖ_арматура элементов" Ещё кружок

 

ThisDrawing.Preferences.LineWeight = acLnWtByLayer 'присваиваем вновь рисуемым линиям свойства толщины "по слою"? Нет. Меняем для дальнейших построений тип линии на "по слою". Мы вначале поставили "по блоку", здесь возвращаем обратно на значение по умолчанию.

End Select 'Закончили перебор

End Sub 'Конец

 

Вставляем блок:

 

Dim obj As AcadObject 'Понял: obj - название переменной типа "блок" Переменная для объекта. Я в неё всё подряд сую.

Set obj = ms.InsertBlock(pt1, "name", 1, 1, 1, 0) 'ms.InsertBlock - что означает ms? Первый параметр - координаты точки привязки (или вставки?) блока, второй - имя, а остальные

ms глобальная переменная, объявлена где-то выше. ms = thisdrawind.modelspace (как-то так, пишу по памяти)

первый параметр - точка вставки блока.

второй - имя блока

третий четвертый пятый соответственно масштабы блока по x y z

шестой не помню =)

 

 

Заранее прошу прощения, за, может, идиотские вопросы.

Но в программировании я полный нуль, и то если себе не льщу )))

Просто очень нужно сделать одну вещь, а кроме меня - некому.

Если есть справочник по VBA с полным набором команд и параметров которые они могут принимать буду признателен, если поделитесь.

Справочник тут: _http://vbamodel.narod.ru/index.htm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо БОЛЬШОЕ!

Предлагаю перенести обсуждение в эту ветку: http://forum.nanocad.ru/index.php?showtopic=3182&view=findpost&p=28522

В данной ветке, я буду писать только относительно Вашего кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

×
×
  • Создать...