Перейти к содержанию

Первые шаги в мир программирования под nanoCAD


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

пример работающего кода vbs (рисуем разрез стены с армированием)

Dim ms
Set ms = ThisDrawing.ModelSpace
Dim ut
Set ut = ThisDrawing.Utility
Dim oLine
Dim oDim
Dim point, point_sa
Dim xx
Dim yy
point = ut.GetPoint("0,0,0", "Укажите точку 1")
point_sa = ut.CreateSafeArrayFromVector(point)
xx = int(point_sa(0))
yy = int(point_sa(1))
Dim point2, point_sa2
Dim xx2
Dim yy2
point2 = ut.GetPoint("0,0,0", "Укажите точку 2")
point_sa2 = ut.CreateSafeArrayFromVector(point2)
xx2 = int(point_sa2(0))
yy2 = int(point_sa2(1))
dim dlina
dlina = xx2-xx
dim tsten
tsten = 200
dim dist
dist = 110
dim step
step = 400
dim scale
scale = 2
dim kray
kray = (tsten-dist)/2
dim q
q = int((dlina/scale - kray*2 - dist*2)/step)
dim dobor
dobor = 0
if (dlina/scale - kray*2 - dist*2)-q*step < 100 then
q = q-1
dobor = int(dlina/scale - kray*2 - dist*2 - q*step)
end if
line 0,0,tsten*scale,0
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line tsten*scale,0,dlina-tsten*scale,0
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line dlina-tsten*scale,0,dlina,0
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line dlina,0,dlina,tsten*scale
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line dlina,tsten*scale,dlina-tsten*scale,tsten*scale
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line dlina-tsten*scale,tsten*scale,tsten*scale,tsten*scale
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line tsten*scale,tsten*scale,0,tsten*scale
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line 0,tsten*scale,0,0
oLine.Layer = "КЖ_элементы Стм Фсм К Б"
line kray*scale-20,kray*scale,(kray+dist)*scale+20,kray*scale
line (kray+dist)*scale,kray*scale-20,(kray+dist)*scale,(kray+dist)*scale+20
line (kray+dist)*scale+20,(kray+dist)*scale,kray*scale-20,(kray+dist)*scale
line kray*scale,(kray+dist)*scale+20,kray*scale,kray*scale-20
circle kray*scale+20,kray*scale+20,20
circle (kray+dist)*scale-20,kray*scale+20,20
circle (kray+dist)*scale-20,(kray+dist)*scale-20,20
circle kray*scale+20,(kray+dist)*scale-20,20
DimAlignedText 0,-50,kray*scale,-50,0,-200,kray
DimAlignedText kray*scale,-50,(kray+dist)*scale,-50,0,-200,dist
line dlina-kray*scale+20,kray*scale,dlina-(kray+dist)*scale-20,kray*scale
line dlina-(kray+dist)*scale,kray*scale-20,dlina-(kray+dist)*scale,(kray+dist)*scale+20
line dlina-(kray+dist)*scale-20,(kray+dist)*scale,dlina-kray*scale+20,(kray+dist)*scale
line dlina-kray*scale,(kray+dist)*scale+20,dlina-kray*scale,kray*scale-20
circle dlina-kray*scale-20,kray*scale+20,20
circle dlina-(kray+dist)*scale+20,kray*scale+20,20
circle dlina-(kray+dist)*scale+20,(kray+dist)*scale-20,20
circle dlina-kray*scale-20,(kray+dist)*scale-20,20
DimAlignedText dlina-kray*scale,-50,dlina,-50,0,-200,kray
DimAlignedText dlina-(kray+dist)*scale,-50,dlina-kray*scale,-50,0,-200,dist
dim i
for i=1 to q
line (kray+dist+i*step)*scale,kray*scale-20,(kray+dist+i*step)*scale,(kray+dist)*scale+20
circle (kray+dist+i*step)*scale+20,kray*scale+20,20
circle (kray+dist+i*step)*scale+20,(tsten-kray)*scale-20,20
next
if q = 0 then
else
if q = 1 then
 DimAlignedText (kray+dist)*scale,-50,(kray+dist+q*step)*scale,-50,0,-200,step
else
 DimAlignedText (kray+dist)*scale,-50,(kray+dist+q*step)*scale,-50,0,-200,step&"х"&q&"="&q*step
end if
end if
if dobor = 0 then
DimAlignedText (kray+dist+q*step)*scale,-50,dlina-(kray+dist)*scale,-50,0,-200,int((dlina/scale - kray*2 - dist*2 - q*step)/5)*5
else
line (kray+dist+q*step)*scale+int(dobor/2)*scale,40*scale,(kray+dist+q*step)*scale+int(dobor/2)*scale,(tsten-40)*scale
circle (kray+dist+q*step)*scale+20+int(dobor/2)*scale,25*scale+50,20
circle (kray+dist+q*step)*scale+20+int(dobor/2)*scale,(tsten-25)*scale-50,20
DimAlignedText (kray+dist+q*step)*scale,-50,(kray+dist+q*step)*scale+int(dobor/2)*scale,-50,0,-200,int(dobor/10)*5
DimAlignedText (kray+dist+q*step)*scale+int(dobor/2)*scale,-50,(kray+dist+q*step)*scale+dobor*scale,-50,0,-200,int(dobor/10)*5
end if
Sub Line(x1,y1,x2,y2)
Set oLine = ms.AddLine(CStr(xx+x1)+","+CStr(yy+y1)+","+CStr(0), CStr(xx+x2)+","+CStr(yy+y2)+","+CStr(0))
oLine.Layer = "КЖ_арматура элементов"
End Sub
Sub DimAlignedText(x1,y1,x2,y2,dx,dy,dimtext)
Set oDim = ms.AddDimAligned(CStr(xx+x1)+","+CStr(yy+y1)+","+CStr(0), CStr(xx+x2)+","+CStr(yy+y2)+","+CStr(0),CStr(xx+dx)+","+CStr(yy+dy))
oDim.Layer = "КЖ_размеры"
oDim.TextOverride = dimtext
oDim.ScaleFactor = "40"
oDim.TextInside = true
End Sub
Sub circle(x1,y1,dx)
Set oLine = ms.AddCircle(CStr(xx+x1)+","+CStr(yy+y1)+","+CStr(0), CStr(dx))
oLine.Layer = "КЖ_арматура элементов"
End Sub

Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 267
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Популярные посты

не все. от версии к версии поддержка LISP растет. по этому куску вырванного из контекста, не понятно, что там проще или сложнее. по языкам ИМХО: LISP - кроме автокад/нанокад, почти нигде не понадо

Начиная с 7 версии можно получить nanocad.application через .NET, способом не зависящим от регистрации COM сервера   https://github.com/RobinKzn/CustomAutosaveNanoCad/blob/master/autosave7x3

неужели никаких предложений нету?

Изображения в теме

ну ядрена копоть!

Dim pline, cc, coords(5), pline_coords_str
'method 1
coords(0) = 0
coords(1) = 0
coords(2) = 10
coords(3) = 20
coords(4) = 30
coords(5) = 40
set pline = ThisDrawing.ModelSpace.AddPolyline(coords)
'method 2
pline_coords_str = "0;0;0;100;0;0;100;100;0;0;100;0;0;0;0"
set pline = ThisDrawing.ModelSpace.AddPolyline(ThisDrawing.Utility.CreateTypedArrayFromJSArray (5, CStr(pline_coords_str)))

 

АХТУНГ : для метода 2 есть 2 тонких момента

1) стринг с координатами надо явно кастировать к стрингу - (CStr(pline_coords_str)

2) результат CreateTypedArrayFromJSArray нельзя засовывать в переменную, надо использовать сразу

все это из-за того, что иначе лишний референс получается.

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

о, спасибо!

а такой вопрос ещё вдогонку. я некоторые координаты вычисляю, и если есть деление, то ясен пень иногда получаются дробные значения, типа "0,5"

и когда передаю их в AddLine, они воспринимаются не как одна координата, а как две (через запятую) =(

приходится загонять вычисления в int()

можно это как-то иначе решить?

вот так, например, норм:

Set oLine = ms.AddLine(CStr(int(xx+x1))+","+CStr(int(yy+y1))+","+CStr(0), CStr(int(xx+x2))+","+CStr(int(yy+y2))+","+CStr(0))

 

а, ну и самый взрыв мозга - как в полилинию добавить дугу сразу? =)

Изменено пользователем swell{d}
Ссылка на сообщение
Поделиться на другие сайты

дробные значения надо загонять через точку! ("0.5")

а дугу в полилинию сразу - никак. то есть вообще. там на самом деле для каждого вертекса куча параметров, на все сочетания никаких методов создания не напасешься. так что создать "как проще", а потом рихтовать по месту.

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

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

придётся копировать уже нарисованные....

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

Ну, вообще-то ни одна зараза не мешает написать свою обертку вокруг создания полилайна, и просунуть в нее все, что нужно, для создания дуговых сегментов.

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

Да подожди ты, мы полчаса назад только разобрались как полилинию рисовать... =)

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

Вопрос по LISP

Чем можно заменить функцию nentsel (которая отсутствует в NANOCAD)?

Прилагаемый файл не работает в NANOCAD

 

mt2ml.lsp

 

NENTSEL функция не определена

ошибка: неверный тип аргумента: LENTITYP: nil

Изменено пользователем BOSS_2014
Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Задам вопрос здесь, хотя скорей всего это и не связано с программированием. Суть в том, что простенькая функция:

(defun pl_styles (/ lst lyr)
   (setq lst (list (cdr (assoc 2 (tblnext "STYLE" T)))))
   (while (setq lyr (tblnext "STYLE"))
     (setq lst (cons (cdr (assoc 2 lyr)) lst))
   )
   (reverse lst)
 )

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

Собственно вопрос: это нормально, если нет будет ли исправлено и когда, если будет

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...
  • 1 месяц спустя...

Может быть кто-нибудь знает в чем секрет?)

Пишу скрипт на JS.

В Нанокаде 5.0 при ошибке в скрипте он выдавал описание, из-за чего ошибка, в какой строке скрипта.

В Нанокаде 6.0 при ошибках он просто ничего не делает, никаких сообщений об ошибке не выводит.

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Здравствуйте!

Подскажите, а имеется ли справочник по javascript функциям? Было бы очень интересно полистать. (в справке к программе не узрел)

А конкретно сейчас меня интересует функция заливки области.

Изменено пользователем ahapych
Ссылка на сообщение
Поделиться на другие сайты

это не относится к java...смотрите SDK по ModelSpace nanoCAD...

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

это не относится к java...смотрите SDK по ModelSpace nanoCAD...

Извините, но нашел только функции для построения линий, лучей, окружностей, эллипсов, однострочного и многострочного текста. Вряд ли список возможностей ограничивается этим...

Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...

Помогите нужно установить слой 0 текущим.

Все перепробовал не получается.

Что я делаю не так?

 

'Подпрограмма-функция установления слоя "0" текущим.

'Толщина линии задана жестко - по слою

Sub LAYER_0()

Dim layer As AcadLayer 'переменная типа "слой"

Set layer = ThisDrawing.Layers.Add("0") 'создаем новый слой и присваиваем ему имя

layer.Color = 7 'устанавливаем цвет слоя

layer.LineWeight = acLnWtByLayer 'толщина линии - "по слою"

ThisDrawing.ActiveLayer = layer ' переключаем текущий слой на созданный

End Sub

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

скорее всего, засада в том, что слой 0 создавать не надо - он всегда есть. так что всего и делов-то :

ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item("0")

или даже

ThisDrawing.ActiveLayer = ThisDrawing.Layers("0")

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

'Подпрограмма-функция установления текущим слоем "0".

'Функция устанавливает текущим слой "0"

'Толщина линии и цвет заданы жестко - по слою

Sub LAYER_0()

Dim layer0 As AcadLayer 'переменная типа "слой"

Set layer0.Color = Colorlayer 'устанавливаем цвет слоя - "по слою"

layer0.LineWeight = acLnWtByLayer 'толщина линии - "по слою"

ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item("0") ' устанавливаем текущий слой на "0"

End Sub

 

не работает почему-то. Хотя вот эта часть работает без нареканий:

 

'Подпрограмма-функция создания слоя и установления его текущим.

'Функция создает слой присваивает ему имя, цвет (задается пользователем) и устанавливает его текущим

'Толщина линии задана жестко - по слою

Sub MY_LAYER(Namelayer As String, Colorlayer As Byte)

Dim layer As AcadLayer 'переменная типа "слой"

Set layer = ThisDrawing.Layers.Add(Namelayer) 'создаем новый слой и присваиваем ему имя

layer.Color = Colorlayer 'устанавливаем цвет слоя - "по слою"

layer.LineWeight = acLnWtByLayer 'толщина линии - "по слою"

ThisDrawing.ActiveLayer = layer ' переключаем текущий слой на созданный

End Sub

Изменено пользователем Lion2032
Ссылка на сообщение
Поделиться на другие сайты

'Подпрограмма-функция установления текущим слоем "0".

'Функция устанавливает текущим слой "0"

'Толщина линии и цвет заданы жестко - по слою

Sub LAYER_0()

Dim layer0 As AcadLayer 'переменная типа "слой"

Set layer0.Color = Colorlayer 'устанавливаем цвет слоя - "по слою"

layer0.LineWeight = acLnWtByLayer 'толщина линии - "по слою"

ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item("0") ' устанавливаем текущий слой на "0"

End Sub

тогда уж не так...

Sub LAYER_0()
Dim layer0 As AcadLayer 'переменная типа "слой"
Set layer0 = ThisDrawing.Layers.Item("0")
Set layer0.Color = Colorlayer 'устанавливаем цвет слоя - "по слою"
layer0.LineWeight = acLnWtByLayer 'толщина линии - "по слою"
ThisDrawing.ActiveLayer = layer0 ' устанавливаем текущий слой на "0"
End Sub

хотя, вообще-то, есть резон проверить сначала - а надо ли менять параметры слоя

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

Параметры менять надо.

Но все равно не работает (((

 

Извините, если я не понимаю простых вещей

post-31413-0-17100300-1415276599.png

Изменено пользователем Lion2032
Ссылка на сообщение
Поделиться на другие сайты

Параметры менять надо.

Но все равно не работает (((

 

Извините, если я не понимаю простых вещей

Мдэ... на параметры я что-то внимания не обратил.

значится, так...

вот у нас есть слой. у него есть свойства - например color и lineweight. а теперь попробуем представить, каким образом у СЛОЯ может быть цвет ПО СЛОЮ? правильно, никаким!

с лайнвейтом - ровно та же штука. то есть эти параметры слоя должны быть заданы ЯВНО.

ByLayer - это могут быть параметры у конкретного объекта. так что тут надо как-то это не так делать...

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

Примерно ясно, но что конкретно...)))

 

Dim Colorlayer As ?как? 'задаем переменную явно

Set Colorlayer = ?чему? 'задаем параметр по слою

Set layer0.Color = Colorlayer

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

не. тут фокус в другом. у слоя не может быть цвет "по слою" - откуда он его должен взять? тут может быть только конкретный цвет - красный, зеленый...

а "по слою" - это только у объекта. у линии например.

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

Понял, нужен белый (в смысле: черно-белый ) и толщина 0,0

 

Dim Colorlayer As byte 'задаем переменную явно

Set Colorlayer = 7 'задаем параметр по слою

Set layer0.Color = Colorlayer

 

Так?

Изменено пользователем Lion2032
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!

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