Hoe maak je knoppenmenu’s voor BricsCAD (en AutoCAD) voor je bedrijf zonder alle overhead van complexe XML-code? Dat is waar dit artikel een antwoord op biedt. AutoCAD – en dus ook BricsCAD – gebruikt XML voor de definities van het lint, de menubalken en de werkbalken. XML bestanden zijn bedoeld om leesbaar te zijn voor zowel mensen als computers. Helaas ligt de nadruk vaak op het laatste en is het moeilijk om XML vanaf klad te schrijven. Daar komt nog bij dat het standaardmenu bijna 30 000 regels XML bevat, zodat aanpassingen niet erg eenvoudig te maken zijn. In de goede oude tijd vóór XML zagen menu’s er heel anders uit. Het was een eenvoudig tekstformaat met extensie .mnu. Het mooie is dat beide CAD-systemen .mnu bestanden kunnen lezen als deelmenu’s. Dus leek het ons leuk om hier een voorbeeld van te beschrijven.
Table of Contents
First things first…
- Dit voorbeeld is gebaseerd op BricsCAD maar in principe is het ook toepasbaar voor AutoCAD.
- De term deelmenu was al genoemd. BricsCAD wordt geleverd met tal van menu’s. Als je die gaat veranderen dan is dat prima…. totdat je een nieuwe versie krijgt met nieuwe menu’s. Daarom is het beter om voor de organisatie met aparte partial menu’s te werken.
- We beperken ons tot werkbalken.
Structuur van een .mnu-bestand
Hoewel niet moeilijk, is het even wennen aan de syntax. Je kunt het volgende ook als referentie zien voor later. We doen het regel voor regel…
Je kunt commentaar aangeven met één (of meer) schuine strepen (forward slashes). De eerste regel van je bestand:
// This is corporate menu 1.
Dan volgt het gedeelte waar alle toolbars worden opgesomd:
***TOOLBARS
Daarna de eerste “toolbarname” als subsectie:
**TEST_TOOLBAR
Dit wordt altijd gevolgd door een regel als deze:
TAG [Toolbar("toolbarname", orient, visible, xval, yval, rows)]
De TAG – een soort van label – wordt gebruikt als verwijzing naar de HELP-sectie. “Toolbarname” had je al (TEST_TOOLBAR). “orient” is vaak _Floating. “Visible” is _show of _hide. “Xval” en “yval” zijn de schermcoördinaten van de positie in beeldpixels met linksboven nul. “Rows” is meestal 1.
Vervolgens wordt de werkbalk gedefinieerd met een combinatie van respectievelijk knoppen, flyouts, besturingselementen en afstandhouders:
TAG [Button ("buttonname", small_icon.png, large_icon.png)]macro TAG [Flyout ("flyoutname", small_icon.png, large_icon.png, icon, alias)] TAG [Control (element)] [--]
Wat je moet weten is dat er twee groottes van iconen worden gebruikt, 16*16 en 32*32 pixels. “Macro”, uiteraard, is het commando dat aan een knop is gekoppeld. “Icon” wil je als _OtherIcon. “Alias” is de verwijzing naar een volgende toolbarname – een flyout is immers een verwijzing naar een toolbar. “Control” zijn voorgedefinieerde interface-elementen zoals de layer pulldown.
Dat is het zo’n beetje en je kunt de TAGs koppelen aan help-strings. Dus aan het eind volgt sectie…
***HELPSTRINGS
…met regels als:
TAG [the help text]
Een voorbeeld voor CLS
Canadian Lumber Standard (CLS) is waar ons menu over gaat. Meer specifiek: Een werkbalk met knop om een laag “cls” aan te maken en een flyout met drie knoppen om de afmetingen 38*63, 38*88 en 38*140 te tekenen.
Knoppen
Voor de laag en de drie tekenopdrachten, in de afmetingen 16*16 en 32*32 pixels, heb je dus 8 knoppen nodig. PNG is handig.
Een van de procedures voor het tekenen van buttons…. In CAD teken je de knoppen in een raster, binnen een vierkant van 16 eenheden. Je wilt gesloten polylijnen omdat je ze later kunt vullen. Geef dan de opdracht Export en SVG-format (AutoCAD ondersteunt SVG niet, probeer het via PDF). Open de SVG in Inkscape, Ctrl-U tot alles ontgroept is. Selecteer alles, Stroke style 0 width en Fill as Mesh Gradient. Plak nu een knop in een leeg Inkscape-document. Selecteer alles en verander X:, Y:, B: en H: in respectievelijk 0, 0, 32, 32 pixels(!). Ctrl-Shift-D en Formaat wijzigen… naar Pagina of Document. Verander de Fill naar wens, tekenvolgorde (Home- en End-toets). Tenslotte exporteren als PNG.
Als het goed is heb je dan 8 PNG-bestanden. Maak van die bestanden een ZIP-bestand. 7Zip is hier makkelijk voor, selecteer de bestanden in verkenner en kies (RMB, Rechter muisknop) Toevoegen aan archief. Kies als naam corp-1.resz, niet corp-1.zip. Zet compressie op store, niet op normaal. Voor AutoCAD zou je de iconen in de custom icon folder kunnen zetten.
De commando’s
Voor de layer en CLS-tekeningen zijn de commando’s respectievelijk:
^c^c-layer;m;cls;c;1;;;
^c^c_point;\_erase;_last;;_pline;_non;@19,-31.5;_non;@0,63;_non;@-38,0;_non;@0,-63;c;
^c^c_point;\_erase;_last;;_pline;_non;@19,-44;_non;@0,88;_non;@-38,0;_non;@0,-88;c;
^c^c_point;\_erase;_last;;_pline;_non;@19,-70;_non;@0,140;_non;@-38,0;_non;@0,-140;c;
Enkele opmerkingen:
- Puntkomma (;) staat voor het geven van een enter. Typ commando’s op de commandoregel en tel goed 😉 .
- Elke regel begint met ^c^c, iedere ^c bootst het indrukken van de Esc-toets na, om het voorgaande commando af te breken.
- Door commando’s te laten voorafgaan door een underscore (_) werkt het ook in gelokaliseerde versies.
- \ Betekent: Wacht op invoer van de gebruiker.
- _non is handig om vreemde resultaten te voorkomen omdat object snap aan staat.
- @ betekent relatief ten opzichte van het laatst opgegeven punt.
- Voor polylijnen is deze oplossing erg quick and dirty, er zijn betere oplossingen dan eerst een punt te tekenen, het dan te verwijderen met als enig doel het laatst gespecificeerde punt te gebruiken. Met andere woorden: Voor het voorbeeld is het prima maar voor serieus werk is het maken van commando’s in Lisp voor de hand liggend.
Het menu-bestand
Ons bestand ziet er nu zo uit. Ik denk dat dit een stuk duidelijker is dan het veel grotere XML bestand.
// This is corporate menu 1 .
// TAG [Toolbar("toolbarname", orient, visible, xval, yval, rows)]
// TAG [Button ("buttonname", small_icon.png, large_icon.png)]macro
// TAG [Flyout ("flyoutname", small_icon.png, large_icon.png, icon, alias)]
// TAG [Control (element)]
// [--]
***TOOLBARS
**CLS-1
CLS-1 [_Toolbar("CLS-1", _Floating, _Show, 500, 500, 1)]
CLS-LAY [_Button("Make layer CLS", cls-layer-16.png, cls-layer-32.png)]^c^c_-layer;m;cls;c;1;;;
[--]
CLS-SECT [_Flyout("Draw CLS sections", cls-s-16.png, cls-s-32.png, _OtherIcon, CLS-SECTIONS)]
**CLS-SECTIONS
CLS-SECT [_Toolbar("CLS-SECTIONS", _Floating, _Hide, 500, 525, 1)]
CLS-S [_Button("Draw CLS small", cls-s-16.png, cls-s-32.png)]^c^c_point;\_erase;_last;;_pline;_non;@19,-31.5;_non;@0,63;_non;@-38,0;_non;@0,-63;c;
CLS-M [_Button("Draw CLS medium", cls-m-16.png, cls-m-32.png)]^c^c_point;\_erase;_last;;_pline;_non;@19,-44;_non;@0,88;_non;@-38,0;_non;@0,-88;c;
CLS-L [_Button("Draw CLS large", cls-l-16.png, cls-l-32.png)]^c^c_point;\_erase;_last;;_pline;_non;@19,-70;_non;@0,140;_non;@-38,0;_non;@0,-140;c;
***HELPSTRINGS
CLS-1 [CLS Toolbar 1]
CLS-LAY [Create layer CLS and set current]
CLS-SECT [CLS Sections]
CLS-S [CLS Section 38*63]
CLS-M [CLS Section 38*88]
CLS-L [CLS Section 38*140]
De map voor aanpassingen
Als je de CAD-omgeving aanpast met maatwerk dan wil je dat die aanpassingen in een aparte directory staan, eventueel op een netwerkschijf zodat iedereen ze kan gebruiken. Je moet er dan voor zorgen dat BricsCAD ook weet waar die directory staat. Daarom:
SFSP, Search File Support Path, is wat je moet aanpassen. Met andere woorden, dit is het zoekpad van je CAD-programma. Geef opdracht Settings > Program Options > Files > Search File Support Path > voeg een directory toe.
Je hebt de bestanden corp-1.resz en corp-1.mnu. Die zet je in die directory.
Het menu laden
Voer nu het commando CuiLoad uit. Blader en kies bestand corp-1.mnu – let op het bestandstype. Daar zijn de knoppen!
Je kunt beginnen met testen. In geval van fouten, wijzig het .mnu-bestand en doe CuiLoad > Unload > Load.
Je zult zien dat er in de directory ook een bestand corp-1.cui is toegevoegd. Dit is het XML-bestand.
Tot slot
Dit was een korte introductie tot het maken van knoppenmenu’s. Natuurlijk is er veel meer over te zeggen, maar een korte zoektocht op het net zal snel veel antwoorden opleveren. Het kan niet genoeg benadrukt worden hoe belangrijk het is om maatwerk en standaardisatie voor CAD binnen je bedrijf te implementeren. Het is grappig en bijzonder dat een techniek die al tientallen jaren oud is nog steeds waarde heeft. Natuurlijk kunnen wij ook ondersteuning bieden bij het implementeren van bedrijfsstandaardisatie.