Перейти к содержимому


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


Сообщений в теме: 8

#1 swell{d}

    Активист

  • Клуб разработчиков
  • PipPipPipPip
  • 864 сообщений
  • Пол:Мужчина
  • Город:spb.ru
  • Интересы:КЖ

Отправлено 17 Сентябрь 2014 - 18:41

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

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

Прикрепленные файлы

  • Прикрепленный файл  Fordewind.pdf   1,13МБ   127 Количество загрузок:

Сообщение отредактировал swell{d}: 17 Сентябрь 2014 - 19:03

Материалы для проектирования железобетонных конструкций: http://fordewind.org/wiki/

#2 ПГС-Проект

    Активист

  • Пользователи
  • PipPipPipPip
  • 319 сообщений
  • Пол:Мужчина
  • Интересы:Поесть-поспать

Отправлено 15 Октябрь 2014 - 13:34

Круто.

#3 Lion2032

    Активист

  • Пользователи
  • PipPipPipPip
  • 1 235 сообщений

Отправлено 05 Ноябрь 2014 - 18:17

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

#4 swell{d}

    Активист

  • Клуб разработчиков
  • PipPipPipPip
  • 864 сообщений
  • Пол:Мужчина
  • Город:spb.ru
  • Интересы:КЖ

Отправлено 07 Ноябрь 2014 - 15:44

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

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)
Материалы для проектирования железобетонных конструкций: http://fordewind.org/wiki/

#5 Lion2032

    Активист

  • Пользователи
  • PipPipPipPip
  • 1 235 сообщений

Отправлено 08 Ноябрь 2014 - 02:44

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

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

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: 08 Ноябрь 2014 - 13:58


#6 swell{d}

    Активист

  • Клуб разработчиков
  • PipPipPipPip
  • 864 сообщений
  • Пол:Мужчина
  • Город:spb.ru
  • Интересы:КЖ

Отправлено 08 Ноябрь 2014 - 13:53

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

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

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://fordewind.org/wiki/

#7 Lion2032

    Активист

  • Пользователи
  • PipPipPipPip
  • 1 235 сообщений

Отправлено 08 Ноябрь 2014 - 19:44

Спасибо БОЛЬШОЕ!
Предлагаю перенести обсуждение в эту ветку: http://forum.nanocad...indpost&p=28522
В данной ветке, я буду писать только относительно Вашего кода.

#8 GIO

    Участник

  • Пользователи
  • PipPipPip
  • 95 сообщений

Отправлено 08 Декабрь 2014 - 06:40

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

#9 Ruyke

    Активист

  • Пользователи
  • PipPipPipPip
  • 188 сообщений
  • Пол:Мужчина

Отправлено 25 Июль 2016 - 10:17

+1





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей