Jump to content

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


Recommended Posts

пример работающего кода 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

Link to comment
Share on other sites

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

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 нельзя засовывать в переменную, надо использовать сразу

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

Link to comment
Share on other sites

о, спасибо!

а такой вопрос ещё вдогонку. я некоторые координаты вычисляю, и если есть деление, то ясен пень иногда получаются дробные значения, типа "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))

 

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

Edited by swell{d}
Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

  • Like 2
Link to comment
Share on other sites

  • 1 year later...

Вопрос по LISP

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

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

 

mt2ml.lsp

 

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

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

Edited by BOSS_2014
Link to comment
Share on other sites

  • 1 month later...

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

(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)
 )

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

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

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...

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

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

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

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

Link to comment
Share on other sites

  • 1 month later...

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

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

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

Edited by ahapych
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

  • 3 months later...

Помогите нужно установить слой 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

Link to comment
Share on other sites

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

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

или даже

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

Link to comment
Share on other sites

'Подпрограмма-функция установления текущим слоем "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

Edited by Lion2032
Link to comment
Share on other sites

'Подпрограмма-функция установления текущим слоем "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

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

Link to comment
Share on other sites

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

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

 

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

 

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

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

Set layer0.Color = Colorlayer

 

Так?

Edited by Lion2032
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...