Simple API
Introduktion
Section titled “Introduktion”QCAD:s Simple API är en liten uppsättning globala skriptfunktioner som förenklar vanliga uppgifter som att lägga till entiteter i en ritning, fråga efter entiteter och ändra dem (flytta, trimma, avrunda, parallellförskjuta, …). Det är främst avsett för användning i Script Shell och för korta procedurella skript som körs från en fil, men det kan användas från vilket skript som helst.
Simple API täcker bara en liten del av det kompletta QCAD-API:et. Eftersom det självt är skrivet i ECMAScript (JavaScript) är det också en bra utgångspunkt för att lära sig hur det underliggande QCAD-API:et fungerar. Källkoden finns i filerna scripts/simple.js och scripts/simple_*.js i QCAD:s källkod.
Använda Simple API
Section titled “Använda Simple API”I Script Shell (Diverse > Utveckling > Script Shell) och i skript som startas med Diverse > Utveckling > Kör skript är alla Simple API-funktioner tillgängliga direkt. Skriv till exempel:
addLine(0,0, 100,100);I dina egna skriptfiler, till exempel i interaktiva skripthandlingar eller kommandoradsverktyg, inkluderar du först filen simple.js:
include("scripts/simple.js");
addLine(0,0, 100,100);Alla funktioner arbetar på den ritning som för närvarande är öppen i QCAD:s programfönster, såvida inte en transaktion används för att omdirigera dem till ett annat dokument (se Transaktioner).
Alla exempel på den här sidan kan klistras in i Script Shell för en tom ritning. Varje exempel skapar de entiteter det behöver. Använd Visa > Auto Zoom eller funktionen autoZoom() för att se resultatet.
Konventioner
Section titled “Konventioner”Koordinater
Section titled “Koordinater”Positioner kan anges på tre olika sätt:
- Som två separata tal:
addLine(0,0, 100,100) - Som en array med två tal:
addLine([0,0], [100,100]) - Som vektorobjekt:
addLine(new RVector(0,0), new RVector(100,100))
Vinklar anges alltid i grader, utom start- och slutparametrarna för ellipser som anges i radianer.
Entitetsreferenser
Section titled “Entitetsreferenser”Funktioner som arbetar med en befintlig entitet accepterar entiteten i olika former:
- Ett entitets-ID (tal), till exempel
1234. - Ett entitetsobjekt som returneras av skapandefunktionerna, till exempel returvärdet från
addLine(...). - En position i ritningen (
[x,y]ellerRVector): den entitet som ligger närmast den angivna positionen används. - En form (till exempel
new RLine(0,0, 100,0)): åtgärden tillämpas endast på formen, ritningen ändras inte.
var l = addLine(0,0, 100,0);move(l, [0,10]); // via entitetsobjektmove(l.getId(), [0,10]); // via entitets-IDmove([50,20], [0,10]); // via position: entiteten närmast 50,20Klickpositioner
Section titled “Klickpositioner”Vissa åtgärder beror på var en entitet klickas när motsvarande verktyg används interaktivt. Vid trimning behålls den del av entiteten som ligger vid klickpositionen, vid avrundning och fasning bearbetas de ändar av entiteterna som ligger närmast klickpositionerna, och parallellförskjutning skapar paralleller på klickpositionens sida.
I Simple API kan en klickposition följa varje entitetsreferens. Om en entitet refereras via en position fungerar den positionen även som klickposition. Om ingen klickposition anges används entitetens mittpunkt:
var line = addLine(0,0, 100,0);var limit = addLine(70,-20, 70,20);
// trimma line mot limit, behåll den del av linjen som ligger vid 10,0:trim(line, [10,0], limit);Returvärden
Section titled “Returvärden”- Skapandefunktioner returnerar den tillagda entiteten. Entiteten kan skickas till andra funktioner eller frågas efter information (till exempel
getId(),getLength()ellergetStartPoint()). - Transformationer (
move,rotate,scale,mirror,lengthen,reverse) returnerar den ändrade entiteten. - Övriga ändringsfunktioner (
trim,round,bevel,offset,breakOut,autoTrim,divide,explode,stretch) returnerar den transaktion som tillämpades på ritningen ellerundefinedom åtgärden misslyckades. - Om former skickas i stället för entiteter ändrar transformationerna de angivna formerna och alla andra funktioner returnerar de resulterande formerna som en array.
Misslyckade åtgärder genererar inget fel. I stället visas en varning i Script Shell, till exempel ”Enheten kan inte beskäras.”.
Skapa entiteter
Section titled “Skapa entiteter”addPoint
Section titled “addPoint”addPoint(x, y)addPoint([x, y])Lägger till en punktentitet vid den angivna positionen.
for (var i=0; i<10; i++) { addPoint(i*10, 0);}addLine
Section titled “addLine”addLine(x1, y1, x2, y2)addLine([x1, y1], [x2, y2])Lägger till en linje från startpunkten till slutpunkten.
// en triangel:addLine(0,0, 100,0);addLine(100,0, 50,80);addLine(50,80, 0,0);addXLine
Section titled “addXLine”addXLine(x, y, dx, dy)addXLine([x, y], [dx, dy])Lägger till en oändlig linje (konstruktionslinje) genom baspunkten x,y med riktningen dx,dy. Riktningen anges relativt baspunkten.
// horisontell konstruktionslinje och konstruktionslinje i 45 grader genom 0,0:addXLine(0,0, 1,0);addXLine([0,0], [1,1]);addArc
Section titled “addArc”addArc(cx, cy, radius, startAngle, endAngle)addArc(cx, cy, radius, startAngle, endAngle, reversed)addArc([cx, cy], radius, startAngle, endAngle, reversed)Lägger till en båge med angiven mittpunkt, radie, startvinkel och slutvinkel. Vinklarna anges i grader. Bågar går moturs från startvinkeln till slutvinkeln, såvida inte reversed är true (valfritt, standard är false).
// kvartsbåge från 0 till 90 grader:addArc(0,0, 50, 0, 90);
// medurs båge från 0 till 90 grader (de andra tre kvarten):addArc([0,0], 40, 0, 90, true);addCircle
Section titled “addCircle”addCircle(cx, cy, radius)addCircle([cx, cy], radius)Lägger till en cirkel med angiven mittpunkt och radie.
// koncentriska cirklar:for (var r=10; r<=50; r+=10) { addCircle(0,0, r);}addEllipse
Section titled “addEllipse”addEllipse(cx, cy, mx, my, ratio, startParam, endParam, reversed)addEllipse([cx, cy], [mx, my], ratio, startParam, endParam, reversed)Lägger till en ellips eller en ellipsbåge. mx,my är storaxelns ändpunkt, relativt mittpunkten. ratio är förhållandet mellan lillaxeln och storaxeln. startParam och endParam är de ellipsparametrar i radianer där ellipsen börjar och slutar. Använd 0 och 2*Math.PI för en hel ellips.
// hel ellips med storradien 50 och lillradien 25:addEllipse(0,0, 50,0, 0.5, 0, 2*Math.PI, false);
// övre halvan av en roterad ellips:addEllipse([0,0], [30,30], 0.3, 0, Math.PI, false);addPolyline
Section titled “addPolyline”addPolyline(points, closed, relative)Lägger till en polylinje genom de angivna hörnpunkterna. points är en array med hörnpunkter, var och en angiven som [x, y], [x, y, bulge] eller [x, y, bulge, relative]. I stället för x, y kan en RVector användas.
bulge(utbuktning) definierar formen på det segment som börjar vid den här hörnpunkten:0(standard) för ett rakt segment,1för en halvcirkel moturs,-1för en halvcirkel medurs. Andra värden skapar bågsegment däremellan (utbuktningen är tangens för en fjärdedel av bågvinkeln).relative:trueom koordinaterna för den här hörnpunkten är relativa till föregående hörnpunkt.closed:trueför att stänga polylinjen (standard ärfalse).relative:trueför att behandla koordinaterna för alla hörnpunkter som relativa till föregående hörnpunkt (standard ärfalse).
// stängd rektangel:addPolyline([[0,0], [100,0], [100,50], [0,50]], true);
// avlångt spår (slits) med två halvcirklar:addPolyline([[0,60], [80,60,1], [80,80], [0,80,1]], true);
// sicksacklinje med relativa koordinater:addPolyline([[0,100], [10,10], [10,-10], [10,10], [10,-10]], false, true);addSpline
Section titled “addSpline”addSpline(fitPoints, closed)Lägger till en spline genom de angivna anpassningspunkterna. fitPoints är en array med [x, y]-arrayer eller RVector-objekt. Om closed är true stängs splinen (periodisk).
// öppen spline:addSpline([[0,0], [30,40], [60,0], [90,40]], false);
// stängd spline:addSpline([[0,60], [40,80], [80,60], [40,100]], true);Handledningen Köra skript från en fil visar ett annat exempel som plottar en Lissajous-kurva som spline.
addSimpleText
Section titled “addSimpleText”addSimpleText(text, x, y)addSimpleText(text, x, y, height, angle, font, vAlign, hAlign, bold, italic)addSimpleText(text, [x, y], height, angle, font, vAlign, hAlign, bold, italic)Lägger till en enradig text vid den angivna positionen. Alla argument efter positionen är valfria:
height: texthöjd (standard1)angle: textvinkel i grader (standard0)font: teckensnittsnamn (standard"Standard")vAlign: vertikal justering:RS.VAlignTop(standard),RS.VAlignMiddle,RS.VAlignBaseellerRS.VAlignBottomhAlign: horisontell justering:RS.HAlignLeft(standard),RS.HAlignCenterellerRS.HAlignRightbold,italic:trueför fet eller kursiv text (endast TrueType-teckensnitt)
addSimpleText("Hello World", 0,0);addSimpleText("Title", [0,20], 10);addSimpleText("Centered", [50,-20], 5, 0, "Standard", RS.VAlignMiddle, RS.HAlignCenter);addSimpleText("Rotated", 100,0, 5, 45);addSolid
Section titled “addSolid”addSolid(x1, y1, x2, y2, x3, y3, x4, y4)addSolid([x1, y1], [x2, y2], [x3, y3], [x4, y4])Lägger till en helfylld yta (solid) med tre eller fyra hörn. Observera att hörnen på en fyrsidig solid anges i sicksackordning: första hörnet, andra hörnet, sedan hörnet mitt emot det andra hörnet och hörnet mitt emot det första hörnet. För att skapa en triangel anger du det tredje hörnet två gånger.
// fylld kvadrat:addSolid(0,0, 50,0, 0,50, 50,50);
// fylld triangel:addSolid([60,0], [110,0], [85,50], [85,50]);Lägga till former, entiteter och objekt
Section titled “Lägga till former, entiteter och objekt”Följande funktioner lägger till objekt som har skapats med det kompletta QCAD-API:et i ritningen. De är användbara när de specialiserade skapandefunktionerna ovan inte täcker ett visst fall.
addShape
Section titled “addShape”addShape(shape)addShape(shape, color, linetype, lineweight)Lägger till den angivna formen (RLine, RArc, RCircle, REllipse, RPolyline, RSpline, RPoint, …) som ny entitet på det aktuella lagret. Valfritt kan en färg (RColor), en linjetyp (namn eller ID) och en linjetjocklek (till exempel RLineweight.Weight050) anges. Som standard används den aktuella färgen, linjetypen ByLayer och linjetjockleken ByLayer.
addShape(new RLine(new RVector(0,0), new RVector(100,0)));addShape(new RCircle(new RVector(50,0), 20), new RColor("red"));addShape(new RLine(new RVector(0,-20), new RVector(100,-20)), new RColor("blue"), "DASHED", RLineweight.Weight050);addShapes
Section titled “addShapes”addShapes(shapes)Lägger till alla former i den angivna arrayen som nya entiteter.
var shapes = [];for (var i=0; i<5; i++) { shapes.push(new RCircle(new RVector(i*20, 0), 8));}addShapes(shapes);addEntity
Section titled “addEntity”addEntity(entity)addEntity(entity, color, linetype, lineweight)Lägger till den angivna entiteten (REntity) i ritningen. Om ingen färg anges används den aktuella färgen.
var doc = getDocument();var data = new RLineData(new RVector(0,0), new RVector(100,50));var entity = new RLineEntity(doc, data);addEntity(entity);addObject
Section titled “addObject”addObject(object)Lägger till ett valfritt objekt (entitet, lager, block, …) i ritningen och returnerar det tillagda objektet.
// lägg till ett block med namnet "Marker" som innehåller ett kryss:var doc = getDocument();var block = addObject(new RBlock(doc, "Marker", new RVector(0,0)));
var l1 = new RLineEntity(doc, new RLineData(new RVector(-5,0), new RVector(5,0)));l1.setBlockId(block.getId());addEntity(l1);var l2 = new RLineEntity(doc, new RLineData(new RVector(0,-5), new RVector(0,5)));l2.setBlockId(block.getId());addEntity(l2);
// infoga blocket två gånger:addEntity(new RBlockReferenceEntity(doc, new RBlockReferenceData(block.getId(), new RVector(0,0), new RVector(1,1), 0.0)));addEntity(new RBlockReferenceEntity(doc, new RBlockReferenceData(block.getId(), new RVector(50,0), new RVector(2,2), 0.0)));deleteObject
Section titled “deleteObject”deleteObject(object)Tar bort det angivna objektet från ritningen. För att ta bort entiteter är funktionen deleteEntity oftast smidigare.
var line = addLine(0,0, 100,0);deleteObject(line);Lager och attribut
Section titled “Lager och attribut”addLayer
Section titled “addLayer”addLayer(name)addLayer(name, color, linetype, lineweight)Lägger till ett nytt lager med det angivna namnet. Valfritt kan färgnamnet (standard "white", som visas svart på vit bakgrund), linjetypsnamnet (standard "CONTINUOUS") och linjetjockleken (standard RLineweight.Weight000) anges. Returnerar det nya lagret eller undefined om ett lager med det angivna namnet redan finns.
addLayer("Construction", "gray", "DASHED");addLayer("Contour", "blue", "CONTINUOUS", RLineweight.Weight050);hasLayer
Section titled “hasLayer”hasLayer(name)Returnerar true om ett lager med det angivna namnet finns i ritningen.
if (!hasLayer("Holes")) { addLayer("Holes", "red");}setCurrentLayer
Section titled “setCurrentLayer”setCurrentLayer(name)Anger det aktuella lagret. Alla entiteter som läggs till därefter placeras på det här lagret.
addLayer("Holes", "red");setCurrentLayer("Holes");addCircle(0,0, 5);addCircle(50,0, 5);setCurrentLayer("0");setCurrentColor
Section titled “setCurrentColor”setCurrentColor(color)setCurrentColor(r, g, b)Anger färgen för entiteter som läggs till därefter. Färgen kan anges som RColor-objekt eller som röd-, grön- och blåvärden (0-255). Använd new RColor(RColor.ByLayer) för att återställa färgen till ”Från lager”.
setCurrentColor(255, 0, 0);addCircle(0,0, 10);setCurrentColor(new RColor("blue"));addCircle(30,0, 10);setCurrentColor(new RColor(RColor.ByLayer));addCircle(60,0, 10);Fråga efter entiteter
Section titled “Fråga efter entiteter”getEntity
Section titled “getEntity”getEntity(id)getEntity(entity)getEntity(x, y)getEntity([x, y])Returnerar entiteten för den angivna entitetsreferensen, dvs. entiteten med det angivna ID:t, det aktuella tillståndet för den angivna entiteten eller den entitet som ligger närmast den angivna positionen. Returnerar undefined om ingen entitet hittas.
var circle = addCircle(0,0, 20);move(circle, [10,0]);
// circle innehåller fortfarande den gamla mittpunkten, getEntity returnerar det aktuella tillståndet:getEntity(circle).getCenter(); // returnerar 10,0
// entiteten närmast 30,0:getEntity(30,0).getRadius(); // returnerar 20getShape
Section titled “getShape”getShape(id)getShape(entity)getShape(x, y)getShape([x, y])Returnerar geometrin för den angivna entiteten som form (RLine för en linje, RArc för en båge, RPolyline för en polylinje, …). Former kan användas för geometriska beräkningar utan att ritningen ändras.
addPolyline([[0,0], [100,0], [100,50]], false);
var pl = getShape(50,0);pl.getLength(); // returnerar 150getClosestEntity
Section titled “getClosestEntity”getClosestEntity(x, y)getClosestEntity([x, y], range)Returnerar den entitet som ligger närmast den angivna positionen. Om range anges beaktas endast entiteter inom det avståndet från positionen. Returnerar undefined om ingen entitet hittas.
addLine(0,0, 100,0);addLine(0,50, 100,50);
getClosestEntity(50,10).getStartPoint(); // returnerar 0,0getClosestEntity([50,25], 5); // returnerar undefinedgetEntityShape
Section titled “getEntityShape”getEntityShape(entity, position)Returnerar formen för det angivna entitetsobjektet. För sammansatta entiteter som består av flera former (blockreferenser, skrafferingar, måttsättningar, texter) returneras den form som ligger närmast den angivna positionen. Positionen är valfri.
// en blockreferens till ett block med en rektangel:var doc = getDocument();var block = addObject(new RBlock(doc, "Box", new RVector(0,0)));var pl = new RPolylineEntity(doc, new RPolylineData());pl.setShape(new RPolyline([new RVector(0,0), new RVector(40,0), new RVector(40,20), new RVector(0,20)], true));pl.setBlockId(block.getId());addEntity(pl);var ref = addEntity(new RBlockReferenceEntity(doc, new RBlockReferenceData(block.getId(), new RVector(0,0), new RVector(1,1), 0.0)));
// blockreferensens form nära 40,10 (rektangeln):var s = getEntityShape(getEntity(ref), new RVector(41,10));s.getLength(); // returnerar 120getIntersectionPoints
Section titled “getIntersectionPoints”getIntersectionPoints(entity1, entity2)getIntersectionPoints(entity1, entity2, limited)Returnerar en array med skärningspunkterna mellan de två angivna entiteterna eller formerna. Entiteter kan anges som entitetsobjekt, entitets-ID:n eller former. Om limited är false behandlas entiteterna som om de vore oändliga (linjer förlängda, bågar som hela cirklar). Standard är true.
var line = addLine(-50,0, 50,0);var circle = addCircle(0,0, 30);var ips = getIntersectionPoints(line, circle);
// markera skärningspunkterna med små cirklar:for (var i=0; i<ips.length; i++) { addCircle(ips[i], 2);}isPosition och toVector
Section titled “isPosition och toVector”isPosition(value)toVector(value)isPosition returnerar true om det angivna värdet är en position (RVector eller en array med två eller tre tal). toVector konverterar en position som anges som array till en RVector. Dessa funktioner är användbara när du skriver egna funktioner som accepterar positioner på samma sätt som Simple API.
function addCross(pos, size) { var p = toVector(pos); addLine(p.x-size, p.y, p.x+size, p.y); addLine(p.x, p.y-size, p.x, p.y+size);}
addCross([0,0], 5);addCross(new RVector(20,0), 5);isPosition([1,2]); // returnerar trueisPosition("abc"); // returnerar falseÄndra entiteter
Section titled “Ändra entiteter”Transformationer
Section titled “Transformationer”move(entity, dx, dy)move(entity, [dx, dy])Flyttar den angivna entiteten med den angivna förskjutningen.
var c = addCircle(0,0, 10);move(c, 50,0);rotate
Section titled “rotate”rotate(entity, angle)rotate(entity, angle, cx, cy)rotate(entity, angle, [cx, cy])Roterar den angivna entiteten med den angivna vinkeln i grader runt den angivna mittpunkten. Om ingen mittpunkt anges roteras entiteten runt origo 0,0.
// en solfjäder av linjer, roterade runt 0,0:for (var a=0; a<360; a+=30) { var l = addLine(10,0, 50,0); rotate(l, a);}
// rotera en kvadrat runt dess mittpunkt:var sq = addPolyline([[100,0], [120,0], [120,20], [100,20]], true);rotate(sq, 45, [110,10]);scale(entity, factor)scale(entity, factor, cx, cy)scale(entity, factor, [cx, cy])scale(entity, [sx, sy], [cx, cy])Skalar den angivna entiteten med den angivna faktorn. Fokuspunkten (den punkt som förblir på plats) är som standard origo 0,0. Olika faktorer för X och Y kan anges som arrayen [sx, sy]. Observera att vissa entiteter, till exempel cirklar och bågar, inte kan skalas med olika faktorer i X och Y.
var sq = addPolyline([[0,0], [10,0], [10,10], [0,10]], true);scale(sq, 3);
var pl = addPolyline([[50,0], [60,0], [60,10], [50,10]], true);scale(pl, [2,1], [50,0]);mirror
Section titled “mirror”mirror(entity, x1, y1, x2, y2)mirror(entity, [x1, y1], [x2, y2])mirror(entity, new RLine(...))Speglar den angivna entiteten i den axel som definieras av två punkter.
var pl = addPolyline([[10,0], [40,0], [40,30]], false);// spegla i Y-axeln:mirror(pl, 0,0, 0,100);För att behålla originalet och skapa en speglad kopia lägger du först till en kopia av entiteten:
var arc = addArc(20,0, 10, 0, 180);var copy = addShape(getShape(arc));mirror(copy, [0,-10], [0,10]);Trimma och förlänga
Section titled “Trimma och förlänga”trim(trimEntity, limitingEntity)trim(trimEntity, trimPos, limitingEntity, limitingPos)trim(trimEntity, trimPos, limitingEntity, limitingPos, trimBoth)trim(trimPos, limitingPos)Trimmar entiteten trimEntity mot den begränsande entiteten limitingEntity. Den del av den trimmade entiteten som ligger vid klickpositionen trimPos behålls. Om de två entiteterna inte skär varandra förlängs entiteten till den begränsande entiteten. Om det finns flera skärningspunkter används den som ligger närmast klickpositionen limitingPos. Om trimBoth är true trimmas båda entiteterna mot varandra.
var line = addLine(0,0, 100,0);var limit = addLine(70,-20, 70,20);
// behåll den vänstra delen, linjen slutar nu vid 70,0:trim(line, [10,0], limit);// förläng en linje till en cirkel:var line = addLine(0,0, 50,0);var circle = addCircle(100,0, 20);
// förläng till den skärningspunkt med cirkeln som ligger närmast 80,0:trim(line, [25,0], circle, [80,0]); // linjen slutar nu vid 80,0trimBoth
Section titled “trimBoth”trimBoth(entity1, entity2)trimBoth(entity1, pos1, entity2, pos2)trimBoth(pos1, pos2)Trimmar eller förlänger båda entiteterna till deras skärningspunkt. Detta är en genväg för trim med trimBoth satt till true.
// två linjer som inte möts förlängs så att de bildar ett hörn vid 100,0:var a = addLine(0,0, 80,0);var b = addLine(100,20, 100,100);trimBoth(a, b);lengthen
Section titled “lengthen”lengthen(entity, amount)lengthen(entity, start, amount)lengthen(entity, pos, amount)lengthen(pos, amount)Förlänger den angivna entiteten med det angivna beloppet. Negativa belopp förkortar entiteten. Som standard förlängs entiteten vid sin slutpunkt. Ange true för start för att i stället förlänga den vid startpunkten, eller ange en position nära den ände som ska förlängas.
var line = addLine(0,0, 100,0);lengthen(line, 20); // linjen slutar nu vid 120,0lengthen(line, true, -10); // linjen börjar nu vid 10,0
var arc = addArc(0,50, 30, 0, 90);lengthen(arc, [30,50], 10); // förläng bågen vid dess startpunktbreakOut
Section titled “breakOut”breakOut(entity, pos)breakOut(entity, pos, removeSegment)breakOut(pos)Bryter ut segmentet av den angivna entiteten vid den angivna positionen. Segmentet slutar vid de närmaste skärningspunkterna med andra entiteter på båda sidor om positionen. Om det inte finns någon skärningspunkt på ena sidan sträcker sig segmentet till entitetens ände. Om removeSegment är true (standard) tas segmentet bort. Annars behålls det som en separat entitet.
var line = addLine(0,0, 100,0);addLine(30,-10, 30,10);addLine(70,-10, 70,10);
// ta bort den del av linjen som ligger mellan 30,0 och 70,0:breakOut(line, [50,0]);autoTrim
Section titled “autoTrim”autoTrim(entity, pos)autoTrim(pos)Motsatsen till breakOut: behåller endast segmentet av den angivna entiteten vid den angivna positionen och tar bort resten. Segmentet slutar vid de närmaste skärningspunkterna med andra entiteter på båda sidor om positionen.
var line = addLine(0,0, 100,0);addLine(30,-10, 30,10);addLine(70,-10, 70,10);
// behåll endast delen mellan 30,0 och 70,0:autoTrim(line, [50,0]);divide
Section titled “divide”divide(entity, pos)divide(entity, pos1, pos2)divide(pos)Delar upp den angivna entiteten vid den angivna positionen. En öppen entitet (linje, båge, öppen polylinje, …) delas upp i två delar vid en position eller i tre delar vid två positioner. Stängda entiteter (cirklar, hela ellipser, stängda polylinjer) kräver två positioner och delas upp i två delar.
var line = addLine(0,0, 100,0);divide(line, [40,0]); // två linjer: 0..40 och 40..100
var circle = addCircle(0,50, 20);divide(circle, [20,50], [-20,50]); // två halvcirklarround(entity1, entity2, radius)round(entity1, pos1, entity2, pos2, radius)round(entity1, pos1, entity2, pos2, radius, trim)round(pos1, pos2, radius)Avrundar hörnet mellan två entiteter med en båge med den angivna radien (hörnavrundning). Klickpositionerna anger vilka ändar av entiteterna som avrundas. Om trim är true (standard) trimmas båda entiteterna mot avrundningsbågen.
// en rektangel med avrundade hörn:var l1 = addLine(0,0, 100,0);var l2 = addLine(100,0, 100,50);var l3 = addLine(100,50, 0,50);var l4 = addLine(0,50, 0,0);
round(l1, l2, 10);round(l2, l3, 10);round(l3, l4, 10);round(l4, l1, 10);Även hörnen på en polylinje kan avrundas, genom att samma polylinje anges två gånger med en klickposition på vart och ett av de två segmenten:
var pl = addPolyline([[0,0], [100,0], [100,50]], false);round(pl, [50,0], pl, [100,25], 10);bevel och chamfer
Section titled “bevel och chamfer”bevel(entity1, entity2, distance)bevel(entity1, entity2, distance1, distance2)bevel(entity1, pos1, entity2, pos2, distance1, distance2)bevel(entity1, pos1, entity2, pos2, distance1, distance2, trim)bevel(pos1, pos2, distance)Fasar hörnet mellan två entiteter med en rak linje (fas). distance1 är faslinjens avstånd från hörnet längs den första entiteten, distance2 längs den andra entiteten (standard är distance1). Om trim är true (standard) trimmas båda entiteterna mot faslinjen. chamfer är ett alias för bevel.
var a = addLine(0,0, 100,0);var b = addLine(100,0, 100,50);bevel(a, b, 10);
var c = addLine(0,100, 100,100);var d = addLine(100,100, 100,150);chamfer(c, d, 20, 10);offset
Section titled “offset”offset(entity, distance)offset(entity, distance, number)offset(entity, distance, number, side)offset(entity, sidePos, distance)offset(entity, sidePos, distance, number)Skapar paralleller till linjer, koncentriska bågar och cirklar eller parallellkurvor (offsetkurvor) till ellipser och andra entiteter. number är antalet paralleller som ska skapas (standard 1). Parallellerna skapas på båda sidor om entiteten, såvida inte en sida anges, antingen som positionen sidePos intill entiteten eller som side (RS.LeftHand, RS.RightHand eller RS.BothSides). Parallellförskjutning av polylinjer och splines är endast tillgänglig i QCAD Professional.
var line = addLine(0,0, 100,0);offset(line, 5); // en parallell på varje sida
var line2 = addLine(0,30, 100,30);offset(line2, 5, 2, RS.LeftHand); // två paralleller på vänster sida (ovanför)
var circle = addCircle(50,80, 10);offset(circle, [50,95], 3, 4); // fyra koncentriska cirklar utanförreverse
Section titled “reverse”reverse(entity)reverse(x, y)Vänder riktningen på den angivna entiteten, dvs. byter plats på dess start- och slutpunkt.
var line = addLine(0,0, 100,0);line = reverse(line);line.getStartPoint(); // returnerar 100,0explode
Section titled “explode”explode(entity)explode(entity, options)explode(x, y)Exploderar den angivna entiteten till enklare entiteter: polylinjer till linjer och bågar, blockreferenser till deras innehåll, texter till linjer och splines, måttsättningar och skrafferingar till linjer, bågar osv. Den ursprungliga entiteten tas bort.
options är ett valfritt objekt med inställningar som annars hämtas från programinställningarna, till exempel { splineSegments: 64, textToPolylines: true }. Alternativ som stöds är: splineTolerance, splineSegments, ellipseSegments, splinesToLineSegments, textToPolylines, textSplineToLineOrArc, multilineTextToSimpleText och circlesToPolylines.
var pl = addPolyline([[0,0], [100,0,1], [100,50], [0,50]], true);explode(pl); // tre linjer och en bågestretch
Section titled “stretch”stretch(x1, y1, x2, y2, dx, dy)stretch([x1, y1], [x2, y2], [dx, dy])stretch(area, offset)Sträcker alla entiteter i det rektangulära område som definieras av två hörn med den angivna förskjutningen. Entiteter som ligger helt inom området flyttas, entiteter som korsar områdets gräns sträcks (endast ändpunkterna inom området flyttas). Området kan även anges som RBox eller som en stängd RPolyline-form. Om entiteter är markerade i ritningen sträcks endast de markerade entiteterna.
// en rektangel av linjer:addLine(0,0, 100,0);addLine(100,0, 100,50);addLine(100,50, 0,50);addLine(0,50, 0,0);
// gör rektangeln 50 enheter bredare genom att sträcka dess högra sida:stretch([80,-10], [120,60], [50,0]);deleteEntity
Section titled “deleteEntity”deleteEntity(entity)deleteEntity(id)deleteEntity(x, y)Tar bort den angivna entiteten från ritningen.
var l1 = addLine(0,0, 100,0);var l2 = addLine(0,10, 100,10);addLine(0,20, 100,20);
deleteEntity(l1); // via entitetdeleteEntity(l2.getId()); // via entitets-IDdeleteEntity(50,20); // via positionpaste(sourceDocument, destination, offset, scale, rotation, flipHorizontal, flipVertical, toCurrentLayer, overwriteLayers, overwriteBlocks)Klistrar in innehållet i dokumentet sourceDocument i dokumentgränssnittet destination eller i den aktuella ritningen om destination är undefined. Det inklistrade innehållet flyttas med offset, skalas med scale och roteras med rotation grader. Alla argument är obligatoriska:
flipHorizontal,flipVertical:trueför att vända innehållettoCurrentLayer:trueför att klistra in alla entiteter på det aktuella lagretoverwriteLayers,overwriteBlocks:trueför att skriva över befintliga lager eller block med samma namn
// skapa en symbol i ett dokument utanför skärmen:var symbol = createDocument();startTransaction(symbol);addCircle(0,0, 10);addLine(-10,0, 10,0);addLine(0,-10, 0,10);endTransaction();
// klistra in den tre gånger i den aktuella ritningen:for (var i=0; i<3; i++) { paste(symbol, undefined, [i*50, 0], 1+i*0.5, i*15, false, false, false, false, false);}Transaktioner
Section titled “Transaktioner”startTransaction och endTransaction
Section titled “startTransaction och endTransaction”startTransaction()startTransaction(document)endTransaction()Som standard tillämpas varje anrop till Simple API omedelbart på ritningen och kan ångras individuellt. Mellan startTransaction() och endTransaction() samlas alla ändringar in och tillämpas tillsammans när endTransaction anropas. Detta har två fördelar:
- Det går mycket snabbare när många entiteter läggs till.
- Alla ändringar kan ångras i ett enda steg.
Om ett dokument (RDocument) eller ett dokumentgränssnitt (RDocumentInterface) skickas till startTransaction tillämpas alla ändringar på det dokumentet i stället för på den aktuella ritningen. Detta är användbart för att skapa ritningar i bakgrunden, till exempel för att exportera dem till en fil (se createDocumentInterface).
startTransaction();for (var x=0; x<=200; x+=10) { for (var y=0; y<=200; y+=10) { addPoint(x, y); }}endTransaction();Tänk på följande när du arbetar med transaktioner:
- Inom en transaktion är ändringarna ännu inte en del av ritningen. Ändringsfunktioner som
trimellerroundkan inte referera till entiteter som lagts till i samma transaktion. - Entiteter som returneras av skapandefunktioner inom en transaktion har inget giltigt ID, inte ens efter
endTransaction. För att ändra sådana entiteter senare refererar du till dem via position. - Alla entiteter som läggs till inom en transaktion placeras på det lager som är aktuellt när
endTransactionanropas. Ange det aktuella lagret innan transaktionen startas och använd separata transaktioner för olika lager.
startTransaction();addLine(0,0, 100,0);addLine(100,0, 100,50);endTransaction();
// referera till de nya linjerna via position för att avrunda hörnet:round([50,0], [100,25], 10);getTransactionDocument och getTransactionDocumentInterface
Section titled “getTransactionDocument och getTransactionDocumentInterface”getTransactionDocument()getTransactionDocumentInterface()Returnerar det dokument eller dokumentgränssnitt som den aktuella transaktionen gäller. Utanför transaktioner returneras det aktuella dokumentet och dokumentgränssnittet.
var doc = createDocument();startTransaction(doc);addLine(0,0, 10,0);getTransactionDocument() === doc; // returnerar trueendTransaction();getOperation
Section titled “getOperation”getOperation()Returnerar operationen (RAddObjectsOperation) för den aktuella transaktionen. Utanför en transaktion returneras en ny operation som måste tillämpas explicit. Detta är avsett för avancerad användning, till exempel för att kombinera anrop till Simple API med det kompletta QCAD-API:et.
startTransaction();addCircle(0,0, 10);var doc = getTransactionDocument();var e = new RLineEntity(doc, new RLineData(new RVector(-10,0), new RVector(10,0)));getOperation().addObject(e);endTransaction();autoZoom
Section titled “autoZoom”autoZoom()Zoomar den aktuella vyn så att hela ritningen syns.
addCircle(1000,1000, 500);autoZoom();zoomTo
Section titled “zoomTo”zoomTo(entity)zoomTo(entity, margin)zoomTo([x1, y1], [x2, y2])zoomTo([x1, y1], [x2, y2], margin)zoomTo(box, margin)Zoomar till den angivna entiteten, formen eller det rektangulära området. margin är marginalen runt området i pixlar (standard 10).
addCircle(0,0, 100);var small = addCircle(80,0, 2);zoomTo(small, 50);zoomTo([0,0], [100,100]);Dokument och program
Section titled “Dokument och program”getMainWindow
Section titled “getMainWindow”getMainWindow()Returnerar QCAD:s programfönster (RMainWindowQt).
getMainWindow().windowTitle;getDocumentInterface
Section titled “getDocumentInterface”getDocumentInterface()Returnerar dokumentgränssnittet (RDocumentInterface) för den aktuella ritningen. Dokumentgränssnittet kopplar ett dokument till dess vyer och tillhandahåller funktioner för att importera och exportera filer, tillämpa operationer, ångra och göra om.
addLine(0,0, 100,0);getDocumentInterface().undo(); // tar bort linjen igengetDocument
Section titled “getDocument”getDocument()Returnerar det aktuella dokumentet (RDocument). Dokumentet innehåller alla entiteter, lager, block osv. i en ritning och tillhandahåller funktioner för att fråga efter dem.
addLine(0,0, 100,0);addCircle(0,0, 10);getDocument().queryAllEntities().length; // antal entiteter i ritningengetGraphicsView
Section titled “getGraphicsView”getGraphicsView()Returnerar den aktuella eller senast aktiva vyn (RGraphicsView) för den aktuella ritningen.
addCircle(0,0, 50);getGraphicsView().autoZoom();createDocument
Section titled “createDocument”createDocument()Skapar ett nytt, tomt dokument i minnet som inte visas i något fönster. Ett sådant dokument utanför skärmen kan fyllas med hjälp av en transaktion och sedan klistras in i en ritning (se paste).
var doc = createDocument();startTransaction(doc);addLine(0,0, 100,0);addLine(100,0, 100,100);endTransaction();
doc.queryAllEntities().length; // returnerar 2createDocumentInterface
Section titled “createDocumentInterface”createDocumentInterface()Skapar ett nytt, tomt dokument i minnet tillsammans med ett dokumentgränssnitt. Dokumentgränssnittet kan användas för att importera eller exportera filer.
var di = createDocumentInterface();startTransaction(di);addCircle(0,0, 50);addSimpleText("Created by script", [-40,-60], 5);endTransaction();
di.exportFile(QDir.homePath() + "/simple_api_example.dxf", "R27 (2013) DXF");disableInput, enableInput och isInputEnabled
Section titled “disableInput, enableInput och isInputEnabled”disableInput()enableInput()isInputEnabled()disableInput inaktiverar QCAD:s programfönster för att förhindra användarinmatning, till exempel under långa åtgärder eller animationer. enableInput aktiverar programfönstret igen och isInputEnabled returnerar true om användarinmatning för närvarande är aktiverad. Se alltid till att aktivera inmatningen igen i slutet av ditt skript.
update
Section titled “update”update()Bearbetar väntande händelser så att användargränssnittet uppdateras under långa åtgärder. Användarinmatning måste inaktiveras med disableInput innan update anropas.
sleep(milliseconds)Pausar skriptet under den angivna tiden i millisekunder samtidigt som användargränssnittet hålls uppdaterat. Användarinmatning måste inaktiveras med disableInput innan sleep anropas.
Följande exempel använder disableInput, sleep och enableInput för att visa en enkel animation:
disableInput();var c = addCircle(0,0, 10);autoZoom();for (var i=0; i<20; i++) { c = move(c, 5,0); sleep(50);}enableInput();warning
Section titled “warning”warning(message)Visar ett varningsmeddelande. I Script Shell visas varningar i kommandohistoriken. Annars skrivs varningar ut till konsolen.
if (getDocument().queryAllEntities().length===0) { warning("The drawing is empty.");}Användarinmatning
Section titled “Användarinmatning”Följande funktioner visar en enkel dialogruta för att be användaren om ett värde. Om användaren avbryter dialogrutan returneras undefined.
getInt
Section titled “getInt”getInt(title, prompt, value, step, min, max)Ber användaren om ett heltal. value är startvärdet (standard 0), step stegstorleken för rotationsrutan (standard 1), min och max det tillåtna intervallet.
var n = getInt("Circles", "Number of circles:", 5, 1, 1, 100);if (isNull(n)) { warning("Canceled.");}else { for (var i=1; i<=n; i++) { addCircle(0,0, i*10); }}getDouble
Section titled “getDouble”getDouble(title, prompt, value, decimals, min, max)Ber användaren om ett tal. value är startvärdet (standard 0), decimals antalet decimaler som visas (standard 1), min och max det tillåtna intervallet.
var r = getDouble("Circle", "Radius:", 25.0, 2, 0.01, 1000);if (!isNull(r)) { addCircle(0,0, r);}getText
Section titled “getText”getText(title, prompt, text)Ber användaren om en text. text är starttexten (standard tom).
var t = getText("Label", "Text:", "Hello");if (!isNull(t)) { addSimpleText(t, 0,0, 10);}getItem
Section titled “getItem”getItem(title, prompt, items, index, separator)Låter användaren välja ett objekt i en listruta. items är en sträng med alla objekt åtskilda av separator (standard ","). index är indexet för det objekt som är valt från början (standard 0). Returnerar det valda objektet eller undefined om dialogrutan avbröts.
var shape = getItem("Shape", "Shape to add:", "Circle,Square,Triangle", 0);if (shape==="Circle") { addCircle(0,0, 50);}else if (shape==="Square") { addPolyline([[-50,-50], [50,-50], [50,50], [-50,50]], true);}else if (shape==="Triangle") { addPolyline([[-50,-50], [50,-50], [0,50]], true);}Exempel: En fläns
Section titled “Exempel: En fläns”Detta exempel kombinerar flera funktioner i Simple API för att rita en fläns med en hålcirkel, bulthål på ett separat lager och ett rektangulärt urtag med avrundade hörn:
addLayer("Center Lines", "gray", "CENTER");addLayer("Holes", "red");
// ytterkontur:setCurrentLayer("0");addCircle(0,0, 100);
// hålcirkel och centrumlinjer:setCurrentLayer("Center Lines");addCircle(0,0, 75);addLine(-110,0, 110,0);addLine(0,-110, 0,110);
// bulthål, tillagda i en enda transaktion:setCurrentLayer("Holes");startTransaction();for (var a=0; a<360; a+=45) { var angle = a * Math.PI / 180; addCircle(75*Math.cos(angle), 75*Math.sin(angle), 8);}endTransaction();
// kvadratiskt urtag med avrundade hörn i mitten:setCurrentLayer("0");var l1 = addLine(-30,-30, 30,-30);var l2 = addLine(30,-30, 30,30);var l3 = addLine(30,30, -30,30);var l4 = addLine(-30,30, -30,-30);round(l1, l2, 8);round(l2, l3, 8);round(l3, l4, 8);round(l4, l1, 8);
autoZoom();Urtagets linjer läggs till utan transaktion så att de kan skickas direkt till round. Bulthålen läggs till i en transaktion, vilket går snabbare och gör att de kan ångras i ett enda steg.