nanoCAD 20 — objekty a funkce ve VBScript skriptech
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.
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." & vbCrSkript 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:
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", 252 · Objektový model (přehled hierarchie)
Objekty tvoří strom. Kolekce (Documents, Layers, Blocks, SelectionSets…) procházíš přes For Each nebo Item(i) a Count.
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řevody3 · Application
Kořen celé aplikace. Uvnitř skriptu k němu vede ThisDrawing.Application. Metody přiblížení (Zoom*) sídlí právě zde.
| Vlastnost | Význam |
|---|---|
ActiveDocument | aktivní výkres (Document) |
Documents | kolekce otevřených výkresů |
Preferences | nastavení aplikace |
Visible | viditelnost okna (True/False) |
Name / Version / Path | identifikace aplikace |
| Metoda | Význam |
|---|---|
Update | překreslení aplikace |
ZoomAll / ZoomExtents | př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 |
Quit | ukončení aplikace |
4 · Document / ThisDrawing
Reprezentuje jeden výkres (databázi DWG). Nejdůležitější objekt při práci.
| Vlastnost | Význam |
|---|---|
ModelSpace / PaperSpace | prostory pro entity |
Blocks | definice bloků |
Layers, Linetypes, TextStyles, DimStyles | tabulky stylů |
Layouts, Views, Viewports, Groups | rozvržení, pohledy, skupiny |
SelectionSets | výběrové množiny |
Utility | vstup uživatele a převody |
ActiveLayer | aktuální vrstva (čtení i zápis) |
Name / FullName / Path | název a cesta souboru |
Saved | True = beze změn od uložení |
| Metoda | Význam |
|---|---|
Save | ulož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é |
PurgeAll | vyč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.
| Metoda | Vrací / 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 / AngleToReal | převod úhlu ↔ text |
RealToString / DistanceToReal | převod čísla ↔ text |
TranslateCoordinates | př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.
| Metoda | Vytvoří |
|---|---|
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) |
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
| Vlastnost | Význam |
|---|---|
Layer | název vrstvy (řetězec) |
Color | barevný index ACI (0–256) |
TrueColor | plná barva (objekt AcCmColor / RGB) |
Linetype / LinetypeScale | typ čáry a jeho měřítko |
Lineweight | tloušťka čáry |
Visible | viditelnost (True/False) |
ObjectName | název třídy, např. "AcDbCircle" |
Handle | trvalý identifikátor (řetězec) |
Metody
| Metoda | Vý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 |
Ellipse | Center, MajorAxis, MajorRadius, MinorRadius, RadiusRatio, StartAngle, EndAngle |
LWPolyline | Coordinates, Closed, ConstantWidth, Area, Length, Elevation; metody GetWidth/SetWidth, GetBulge/SetBulge |
Text | TextString, Height, Rotation, InsertionPoint, StyleName, Alignment, ObliqueAngle |
MText | TextString, Height, Width, InsertionPoint, AttachmentPoint, Rotation, StyleName |
Point | Coordinates |
BlockReference (Insert) | Name, InsertionPoint, XScaleFactor/Y/Z, Rotation; metody GetAttributes, Explode |
Hatch | PatternName, PatternScale, PatternAngle; metody AppendOuterLoop, AppendInnerLoop, Evaluate |
9 · Vrstvy
ThisDrawing.Layers je kolekce; Add vrátí (nebo najde) vrstvu daného jména.
| Prvek | Význam |
|---|---|
Layers.Add(jméno) | přidá / vrátí vrstvu |
Layers.Item(i), Layers.Count | přístup a počet |
Layer.Name | název |
Layer.Color / TrueColor | barva |
Layer.LayerOn | zapnutá (True/False) |
Layer.Freeze / Lock | zmrazení / uzamčení |
Layer.Linetype / Lineweight | typ a tloušťka čáry |
ThisDrawing.ActiveLayer | nastaví 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.
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.
| Metoda | Vý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, Delete | práce s obsahem |
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 & vbCr12 · 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.
Dim old
old = ThisDrawing.GetVariable("OSMODE") ' ulož stav uchopení
ThisDrawing.SetVariable "OSMODE", 0 ' dočasně vypni
' ... kreslení bez uchopení ...
ThisDrawing.SetVariable "OSMODE", old ' obnov' Mezery a "entery" se posílají jako text; vbCr = stisk Enter
ThisDrawing.SendCommand "_CIRCLE" & vbCr & "0,0" & vbCr & "5" & vbCrUž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".
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).
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
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).| Skupina | Hodnoty |
|---|---|
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 ACI | 1 č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 filtru | 0 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)
| Konstrukce | Poznámka |
|---|---|
Option Explicit | vynutí deklaraci proměnných (na první řádek) |
Dim a, b(2) | deklarace; pole je vždy od indexu 0 |
Set x = objekt | objekty 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] … Next | počítaný cyklus |
For Each e In kolekce … Next | průchod kolekcí / prostorem |
Do While/Until … Loop | podmíněný cyklus |
If … ElseIf … Else … End If | větvení |
Select Case … End Select | přepínač |
Sub / Function … End | procedura / funkce (vrací přes jméno) |
\ · Mod · & | celočíselné dělení · zbytek · spojení řetězců |
On Error Resume Next / GoTo 0 | oš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
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,0Průchod modelem a spočítání kružnic
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 & vbCrVstup od uživatele — kruh na vybraném bodě
Dim ut, p
Set ut = ThisDrawing.Utility
p = ut.GetPoint(, "Zadej stred kruhu: ") ' vrátí pole 3× double
ThisDrawing.ModelSpace.AddCircle p, 5Nová vrstva a přiřazení barvy
Dim lay
Set lay = ThisDrawing.Layers.Add("KOTY")
lay.Color = 1 ' 1 = červená (ACI)
ThisDrawing.ActiveLayer = lay ' nové objekty půjdou semPolární bod
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, p217 · Úskalí a tipy
- Úhly v radiánech. Nejčastější chyba:
AddArc/Rotateberou radiány, ne stupně. - Objekty přes
Set. Přiřazení objektu bezSetskončí chybou; naopak čísla seSetem nepiš. - Souřadnice = pole 3× double (nebo řetězec
"x,y,z"). Pozor na 2D vs 3D metody. - Žádné pojmenované konstanty. Ve VBS piš číselné hodnoty (viz sekce 14).
- Diakritika. Řetězce vypisované na příkazový řádek (
Prompt) drž bez háčků/čárek nebo ulož soubor v odpovídajícím kódování — jinak hrozí „rozsypaný čaj". V komentářích diakritika nevadí. - Po změně geometrie se obraz obvykle překreslí sám; když ne, pomůže
REGENneboThisDrawing.Regen 1. - Dostupnost prvků se liší podle verze/edice — 3D tělesa, tabulky a některé kóty nemusí být všude.
- Autoritativní zdroj je API dokumentace v nanoCAD Developers' Club; tato příručka je praktický přehled kompatibilního ActiveX modelu.