nanoCAD 20 — objekty a funkce ve VBScript skriptech

ActiveX / COM AUTOMATION · JScript & VBScript
VBScript & ActiveX v nanoCADu 20
Referenční přehled objektů, metod a vlastností pro automatizaci kreslení. Objektový model, který nanoCAD sdílí s ActiveX rozhraním AutoCADu.
SPUŠTĚNÍ
příkaz VBS
VSTUPNÍ BOD
ThisDrawing
SOUŘADNICE
pole 3× double
ÚHLY
radiány
BAREVNÝ INDEX
ACI 1–255
Jak číst tuto příručku nanoCAD implementuje objektový model kompatibilní s AutoCAD ActiveX. Naprostá většina zde uvedeného funguje shodně, ale přesná dostupnost jednotlivých metod se může lišit podle verze a edice (Platform vs. moduly). Autoritativní a úplná dokumentace API je součástí nanoCAD Developers' Club. Berte to jako praktickou mapu, ne jako smluvní specifikaci.

1 · Jak spustit skript

Skript je obyčejný textový soubor .vbs. V nanoCADu ho spustíš příkazem VBS (pro JavaScript příkazem JS) a vybereš soubor. Skript se provádí shora dolů — žádnou vstupní funkci nepotřebuje.

Uvnitř takto spuštěného skriptu už máš k dispozici aktivní výkres přes globální objekt ThisDrawing. Od něj se dostaneš ke všemu ostatnímu.

skript.vbs — spuštěno příkazem VBS
Dim ms
Set ms = ThisDrawing.ModelSpace        ' přístup k modelovému prostoru

ms.AddCircle "0,0,0", 10               ' nanoCAD bere souřadnici i jako řetězec
ThisDrawing.Utility.Prompt "Hotovo." & vbCr

Skript může nanoCAD ovládat i zvenčí (samostatný .vbs, z Excelu apod.) — pak si aplikaci vytvoříš přes ProgID nanoCAD.Application a místo ThisDrawing použiješ ActiveDocument:

externí ovládání přes CreateObject
Dim app, doc
Set app = CreateObject("nanoCAD.Application")
app.Visible = True
Set doc = app.ActiveDocument            ' odpovídá "ThisDrawing" uvnitř skriptu
doc.ModelSpace.AddCircle "0,0,0", 25

2 · Objektový model (přehled hierarchie)

Objekty tvoří strom. Kolekce (Documents, Layers, Blocks, SelectionSets…) procházíš přes For Each nebo Item(i) a Count.

hierarchie
Application
 └─ Documents
     └─ Document  (= ThisDrawing / ActiveDocument)
         ├─ ModelSpace   → entity (Line, Circle, Arc, Text, …)
         ├─ PaperSpace   → entity v rozvržení
         ├─ Blocks       → definice bloků
         ├─ Layers       → vrstvy
         ├─ Linetypes / TextStyles / DimStyles / Layouts / Views
         ├─ SelectionSets → výběrové množiny
         └─ Utility      → vstup uživatele + převody

3 · Application

Kořen celé aplikace. Uvnitř skriptu k němu vede ThisDrawing.Application. Metody přiblížení (Zoom*) sídlí právě zde.

VlastnostVýznam
ActiveDocumentaktivní výkres (Document)
Documentskolekce otevřených výkresů
Preferencesnastavení aplikace
Visibleviditelnost okna (True/False)
Name / Version / Pathidentifikace aplikace
MetodaVýznam
Updatepřekreslení aplikace
ZoomAll / ZoomExtentspřiblížení na vše / na hranice
ZoomWindow(p1, p2)přiblížení na obdélník
ZoomCenter(střed, výška)přiblížení na střed
Quitukončení aplikace

4 · Document / ThisDrawing

Reprezentuje jeden výkres (databázi DWG). Nejdůležitější objekt při práci.

VlastnostVýznam
ModelSpace / PaperSpaceprostory pro entity
Blocksdefinice bloků
Layers, Linetypes, TextStyles, DimStylestabulky stylů
Layouts, Views, Viewports, Groupsrozvržení, pohledy, skupiny
SelectionSetsvýběrové množiny
Utilityvstup uživatele a převody
ActiveLayeraktuální vrstva (čtení i zápis)
Name / FullName / Pathnázev a cesta souboru
SavedTrue = beze změn od uložení
MetodaVýznam
Saveuložit výkres
SaveAs(cesta)uložit jako
Regen(kam)regenerace (1 = všechny výřezy)
SendCommand(text)poslat příkaz na příkazový řádek
GetVariable(jm) / SetVariable(jm, h)čtení/zápis systémové proměnné
PurgeAllvyčistit nepoužité prvky
HandleToObject(handle)najít objekt podle handle

5 · Utility — vstup uživatele a převody

Přes ThisDrawing.Utility vypisuješ na příkazový řádek a ptáš se uživatele. Funkce Get… čekají na vstup a vrátí hodnotu.

MetodaVrací / dělá
Prompt(text)výpis na příkazový řádek
GetString(mezery, výzva)řetězec (mezery = True povolí mezery)
GetInteger(výzva)celé číslo
GetReal(výzva)desetinné číslo
GetPoint(báze, výzva)bod (pole 3× double); báze nepovinná
GetCorner(báze, výzva)protější roh obdélníku
GetDistance(báze, výzva)vzdálenost (double)
GetAngle(báze, výzva)úhel v radiánech
GetKeyword(výzva)klíčové slovo (viz InitializeUserInput)
GetEntity(obj, bod, výzva)vybraná entita (výstupní parametry)
InitializeUserInput(bity, slova)omezení dalšího Get… + seznam klíč. slov
PolarPoint(bod, úhel, vzd)bod v polárních souřadnicích
AngleToString / AngleToRealpřevod úhlu ↔ text
RealToString / DistanceToRealpřevod čísla ↔ text
TranslateCoordinatespřevod mezi souřadnými systémy (WCS/UCS/OCS)

6 · Kreslení entit — metody Add…

Metody Add… volej na ModelSpace, PaperSpace nebo na Block. Každá vytvoří entitu a vrátí ji, takže si ji můžeš rovnou přiřadit a dál upravovat.

MetodaVytvoří
AddLine(p1, p2)úsečku
AddCircle(střed, r)kružnici
AddArc(střed, r, úhel1, úhel2)oblouk (úhly v radiánech, proti sm. hodin.)
AddEllipse(střed, vektorHl.osy, poměr)elipsu
AddPoint(p)bod
AddLightWeightPolyline(pole2D)LW polylinii (pole x1,y1,x2,y2,…)
AddPolyline(pole3D)„těžkou" polylinii
AddText(text, bod, výška)jednořádkový text
AddMText(bod, šířka, text)víceřádkový text
AddSpline(body, tan1, tan2)spline
AddHatch(typ, vzor, asoc)šrafování (pak AppendOuterLoop + Evaluate)
AddInsertBlock(bod, jméno, sx, sy, sz, rot)vložení bloku (reference)
AddDimAligned(p1, p2, textPoz)zarovnaná kóta
AddDimRotated(p1, p2, poloha, úhel)lineární kóta pod úhlem
AddDimRadial(střed, tětiva, délkaOdkazu)kóta poloměru
AddDimDiametric(p1, p2, délkaOdkazu)kóta průměru
AddDimAngular(vrchol, p1, p2, textPoz)úhlová kóta
AddLeader(body, popis, typ)odkazovou čáru
AddRay(p1, p2) / AddXline(p1, p2)polopřímku / přímku
AddSolid(p1, p2, p3, p4)2D vyplněný čtyřúhelník
Add3DFace(p1, p2, p3, p4)3D plochu
AddRegion(pole objektů)oblast (region)
Poznámka k dostupnosti 3D tělesa (AddBox, AddCylinder, AddExtrudedSolid…) a některé prvky (tabulky) závisí na edici/modulu nanoCADu. Pokud metoda hlásí chybu, nejspíš ve tvé verzi není — ověř v dokumentaci Developers' Clubu.

7 · Společné vlastnosti a metody entit

Tohle má (téměř) každá nakreslená entita bez ohledu na typ.

Vlastnosti

VlastnostVýznam
Layernázev vrstvy (řetězec)
Colorbarevný index ACI (0–256)
TrueColorplná barva (objekt AcCmColor / RGB)
Linetype / LinetypeScaletyp čáry a jeho měřítko
Lineweighttloušťka čáry
Visibleviditelnost (True/False)
ObjectNamenázev třídy, např. "AcDbCircle"
Handletrvalý identifikátor (řetězec)

Metody

MetodaVýznam
Copy()kopie entity
Delete()smazání
Move(z, do)posun mezi dvěma body
Rotate(báze, úhel)otočení (úhel v radiánech)
Mirror(p1, p2)zrcadlení podle osy
ScaleEntity(báze, faktor)změna měřítka
Offset(vzdálenost)ekvidistanta (vrací pole)
ArrayRectangular(řádky, sl, patra, dŘ, dS, dP)obdélníkové pole
ArrayPolar(počet, úhel, střed)kruhové pole
GetBoundingBox(min, max)ohraničující kvádr (výstupní parametry)
IntersectWith(jiný, režim)průsečíky (vrací pole souřadnic)
Update()překreslení jedné entity

8 · Přehled entit a jejich vlastností

Entita (ObjectName)Klíčové vlastnosti
Line (AcDbLine)StartPoint, EndPoint, Angle, Length, Delta, Normal
Circle (AcDbCircle)Center, Radius, Diameter, Area, Circumference
Arc (AcDbArc)Center, Radius, StartAngle, EndAngle, StartPoint, EndPoint, ArcLength
EllipseCenter, MajorAxis, MajorRadius, MinorRadius, RadiusRatio, StartAngle, EndAngle
LWPolylineCoordinates, Closed, ConstantWidth, Area, Length, Elevation; metody GetWidth/SetWidth, GetBulge/SetBulge
TextTextString, Height, Rotation, InsertionPoint, StyleName, Alignment, ObliqueAngle
MTextTextString, Height, Width, InsertionPoint, AttachmentPoint, Rotation, StyleName
PointCoordinates
BlockReference (Insert)Name, InsertionPoint, XScaleFactor/Y/Z, Rotation; metody GetAttributes, Explode
HatchPatternName, PatternScale, PatternAngle; metody AppendOuterLoop, AppendInnerLoop, Evaluate

9 · Vrstvy

ThisDrawing.Layers je kolekce; Add vrátí (nebo najde) vrstvu daného jména.

PrvekVýznam
Layers.Add(jméno)přidá / vrátí vrstvu
Layers.Item(i), Layers.Countpřístup a počet
Layer.Namenázev
Layer.Color / TrueColorbarva
Layer.LayerOnzapnutá (True/False)
Layer.Freeze / Lockzmrazení / uzamčení
Layer.Linetype / Lineweighttyp a tloušťka čáry
ThisDrawing.ActiveLayernastaví aktuální vrstvu pro nové entity

10 · Bloky a atributy

Definici bloku vytvoříš přes Blocks.Add(počátek, jméno), naplníš ji stejnými Add… metodami jako model, a pak ji vložíš přes AddInsertBlock.

definice a vložení bloku
Dim blk, ref
Set blk = ThisDrawing.Blocks.Add("0,0,0", "ZNACKA")
blk.AddCircle "0,0,0", 3                    ' obsah bloku
blk.AddLine "-4,0,0", "4,0,0"

Set ref = ThisDrawing.ModelSpace.AddInsertBlock("50,50,0", "ZNACKA", 1, 1, 1, 0)
ref.Rotation = 4 * Atn(1) / 2               ' otočit vloženou značku o 90°

U reference bloku s atributy získáš atributy přes ref.GetAttributes() (pole objektů AttributeReference s vlastnostmi TagString a TextString).

11 · Výběrové množiny (SelectionSet)

Pro hromadné operace se hodí SelectionSet s DXF filtrem — vybere jen entity odpovídající zadaným kritériím. Filtr jsou dvě pole: typy (celočíselné DXF kódy) a hodnoty.

MetodaVýznam
SelectionSets.Add(jméno)nová výběrová množina
Select(režim, p1, p2, typy, hodnoty)výběr podle režimu + filtru
SelectOnScreen(typy, hodnoty)výběr myší s filtrem
SelectByPolygon(režim, body, typy, hodnoty)výběr polygonem
Count, Item(i), Clear, Deletepráce s obsahem
výběr: kružnice na vrstvě OTVORY
Dim ss, ft(1), fd(1)
On Error Resume Next
    ThisDrawing.SelectionSets.Item("VYBER").Delete   ' když už existuje
On Error GoTo 0
Set ss = ThisDrawing.SelectionSets.Add("VYBER")

ft(0) = 0 : fd(0) = "CIRCLE"        ' DXF 0  = typ entity
ft(1) = 8 : fd(1) = "OTVORY"        ' DXF 8  = vrstva
ss.Select 5, , , ft, fd             ' 5 = acSelectionSetAll (celý výkres)

ThisDrawing.Utility.Prompt "Vybrano: " & ss.Count & vbCr

12 · Systémové proměnné a příkazy

Cokoli, co v nanoCADu ovládá systémová proměnná, nastavíš z VBS. A když pro něco není přímá metoda, pošli rovnou příkaz na příkazový řádek.

GetVariable / SetVariable
Dim old
old = ThisDrawing.GetVariable("OSMODE")    ' ulož stav uchopení
ThisDrawing.SetVariable "OSMODE", 0         ' dočasně vypni
' ... kreslení bez uchopení ...
ThisDrawing.SetVariable "OSMODE", old       ' obnov
SendCommand — příkaz jako text
' Mezery a "entery" se posílají jako text; vbCr = stisk Enter
ThisDrawing.SendCommand "_CIRCLE" & vbCr & "0,0" & vbCr & "5" & vbCr

Užitečné proměnné: CLAYER (aktuální vrstva), CECOLOR (barva), CELTYPE (typ čáry), OSMODE (uchopení), LUNITS/AUNITS (jednotky), TEXTSIZE, DIMSCALE, CMDECHO, FILEDIA.

13 · Souřadnice, úhly a barvy

Souřadnice

Bod je pole tří double. Ve VBScriptu ho vytvoříš přes Dim p(2) (indexy 0,1,2). nanoCAD navíc přijímá i pohodlný řetězec ve tvaru "x,y,z".

dva způsoby zadání bodu
Dim p(2)
p(0) = 10 : p(1) = 20 : p(2) = 0
ThisDrawing.ModelSpace.AddCircle p, 5        ' pole 3× double

ThisDrawing.ModelSpace.AddCircle "10,20,0", 5 ' řetězec (nanoCAD)

Úhly

API pracuje výhradně v radiánech (ne ve stupních). VBScript nemá konstantu Pi — spočítáš ji jako 4 * Atn(1).

převod stupňů na radiány
Function Rad(deg)                 ' stupně → radiány
    Rad = deg * (4 * Atn(1)) / 180
End Function

ThisDrawing.ModelSpace.AddArc "0,0,0", 25, Rad(0), Rad(90)

Barvy

Nejjednodušší je barevný index ACI (Color): 1 červená, 2 žlutá, 3 zelená, 4 azurová, 5 modrá, 6 fialová, 7 bílá/černá; 0 = ByBlock, 256 = ByLayer. Pro plnou barvu slouží TrueColor.

14 · Konstanty a číselné kódy

Pozor — VBScript nezná pojmenované konstanty Pojmenované konstanty typu acAllViewports nebo acSelectionSetAll jsou součástí typové knihovny (VBA), ne VBScriptu. Ve .vbs proto piš jejich číselné hodnoty (nebo si je nadefinuj přes Const).
SkupinaHodnoty
Regenerace (Regen)0 = aktivní výřez, 1 = všechny výřezy
Režim výběru (Select)0 Window · 1 Crossing · 3 Previous · 4 Last · 5 All
Barvy ACI1 čer · 2 žlu · 3 zel · 4 azu · 5 mod · 6 fia · 7 bíl/čer · 0 ByBlock · 256 ByLayer
InitializeUserInput (bity)1 = bez prázdného vstupu · 2 = bez nuly · 4 = bez záporných (sčítá se)
DXF kódy filtru0 typ entity · 2 název bloku · 6 typ čáry · 8 vrstva · 62 barva (ACI) · 39 tloušťka

15 · VBScript — jazykový základ (v kontextu CAD)

KonstrukcePoznámka
Option Explicitvynutí deklaraci proměnných (na první řádek)
Dim a, b(2)deklarace; pole je vždy od indexu 0
Set x = objektobjekty se přiřazují přes Set; čísla/řetězce bez něj
ReDim Preserve a(n)změna velikosti pole (se zachováním obsahu)
For i = 1 To n [Step k] … Nextpočítaný cyklus
For Each e In kolekce … Nextprůchod kolekcí / prostorem
Do While/Until … Looppodmíněný cyklus
If … ElseIf … Else … End Ifvětvení
Select Case … End Selectpřepínač
Sub / Function … Endprocedura / funkce (vrací přes jméno)
\  ·  Mod  ·  &celočíselné dělení · zbytek · spojení řetězců
On Error Resume Next / GoTo 0ošetření chyb (+ objekt Err)

Vestavěné funkce se hodí i tady: matematické Abs, Int, Fix, Sqr, Sin, Cos, Tan, Atn; textové Len, Mid, Left, Right, InStr, Replace, Split, UCase; převody CStr, CDbl, CInt, Round; dialogy MsgBox, InputBox. Konstanty vbCr, vbCrLf, vbTab pro formátování výpisů.

16 · Příklady

Základ — kružnice a úsečka

geometrie
Dim ms, c(2), p(2), q(2)
Set ms = ThisDrawing.ModelSpace

c(0) = 50 : c(1) = 30 : c(2) = 0
ms.AddCircle c, 10             ' kruh, poloměr 10

p(0) = 0   : p(1) = 0 : p(2) = 0
q(0) = 100 : q(1) = 0 : q(2) = 0
ms.AddLine p, q               ' úsečka 0,0 → 100,0

Průchod modelem a spočítání kružnic

For Each + ObjectName
Dim ent, n
n = 0
For Each ent In ThisDrawing.ModelSpace
    If InStr(ent.ObjectName, "Circle") > 0 Then n = n + 1
Next
ThisDrawing.Utility.Prompt "Kruhu: " & n & vbCr

Vstup od uživatele — kruh na vybraném bodě

GetPoint
Dim ut, p
Set ut = ThisDrawing.Utility
p = ut.GetPoint(, "Zadej stred kruhu: ")   ' vrátí pole 3× double
ThisDrawing.ModelSpace.AddCircle p, 5

Nová vrstva a přiřazení barvy

Layers
Dim lay
Set lay = ThisDrawing.Layers.Add("KOTY")
lay.Color = 1                     ' 1 = červená (ACI)
ThisDrawing.ActiveLayer = lay     ' nové objekty půjdou sem

Polární bod

PolarPoint
Dim ut, base(2), p2
Set ut = ThisDrawing.Utility
base(0) = 0 : base(1) = 0 : base(2) = 0
p2 = ut.PolarPoint(base, 4 * Atn(1) / 4, 100)  ' 45°, vzdálenost 100
ThisDrawing.ModelSpace.AddLine base, p2

17 · Úskalí a tipy