콘텐츠로 이동

Simple API

QCAD Simple API는 도면에 엔티티 추가, 엔티티 조회 및 수정(이동, 트림, 라운드, 오프셋 등)과 같은 일반적인 작업을 간단하게 해 주는 소수의 전역 스크립트 함수 모음입니다. 주로 스크립트 셸과 파일에서 실행하는 짧은 절차적 스크립트에서 사용하도록 설계되었지만, 어떤 스크립트에서든 사용할 수 있습니다.

Simple API는 전체 QCAD API의 작은 부분만 다룹니다. Simple API 자체가 ECMAScript(JavaScript)로 작성되어 있으므로, 그 기반이 되는 QCAD API의 작동 방식을 배우기 위한 좋은 출발점이기도 합니다. 소스 코드는 QCAD 소스 코드의 scripts/simple.js 및 scripts/simple_*.js 파일에서 찾을 수 있습니다.

스크립트 셸(기타 > 개발 > 스크립트 셸)과 기타 > 개발 > 스크립트 실행으로 시작한 스크립트에서는 모든 Simple API 함수를 바로 사용할 수 있습니다. 예를 들어 다음과 같이 입력합니다.

addLine(0,0, 100,100);

자체 스크립트 파일, 예를 들어 대화형 스크립트 액션이나 명령줄 도구에서는 먼저 simple.js 파일을 포함합니다.

include("scripts/simple.js");
addLine(0,0, 100,100);

트랜잭션을 사용하여 다른 문서로 전환하지 않는 한, 모든 함수는 QCAD 애플리케이션 창에서 현재 열려 있는 도면에 대해 작동합니다(트랜잭션 참조).

이 페이지의 모든 예제는 빈 도면의 스크립트 셸에 붙여넣을 수 있습니다. 각 예제는 필요한 엔티티를 직접 생성합니다. 결과를 보려면 보기 > 자동 줌 또는 autoZoom() 함수를 사용합니다.

위치는 세 가지 방법으로 전달할 수 있습니다.

  • 두 개의 개별 숫자로: addLine(0,0, 100,100)
  • 두 숫자의 배열로: addLine([0,0], [100,100])
  • 벡터 객체로: addLine(new RVector(0,0), new RVector(100,100))

각도는 항상 도 단위로 지정합니다. 단, 타원의 시작 및 끝 매개변수는 라디안 단위로 지정합니다.

기존 엔티티를 다루는 함수는 다양한 형태로 엔티티를 받습니다.

  • 엔티티 ID(숫자), 예: 1234.
  • 생성 함수가 반환하는 엔티티 객체, 예: addLine(...)의 반환값.
  • 도면 내의 위치([x,y] 또는 RVector): 주어진 위치에 가장 가까운 엔티티가 사용됩니다.
  • 도형(예: new RLine(0,0, 100,0)): 작업이 도형에만 적용되며 도면은 변경되지 않습니다.
var l = addLine(0,0, 100,0);
move(l, [0,10]); // 엔티티 객체로
move(l.getId(), [0,10]); // 엔티티 ID로
move([50,20], [0,10]); // 위치로: 50,20에 가장 가까운 엔티티

일부 작업은 해당 도구를 대화형으로 사용할 때 엔티티를 어디에서 클릭하는지에 따라 달라집니다. 트림은 클릭 위치에 있는 엔티티 부분을 유지하고, 라운드와 모따기는 클릭 위치에 가장 가까운 엔티티 끝을 처리하며, 오프셋은 클릭 위치 쪽에 평행선을 생성합니다.

Simple API에서는 모든 엔티티 참조 뒤에 클릭 위치를 지정할 수 있습니다. 엔티티를 위치로 참조하는 경우 그 위치가 클릭 위치 역할도 합니다. 클릭 위치를 지정하지 않으면 엔티티의 중간점이 사용됩니다.

var line = addLine(0,0, 100,0);
var limit = addLine(70,-20, 70,20);
// line을 limit까지 트림하고 10,0에 있는 line 부분을 유지:
trim(line, [10,0], limit);
  • 생성 함수는 추가된 엔티티를 반환합니다. 이 엔티티는 다른 함수에 전달하거나 정보를 조회할 수 있습니다(예: getId(), getLength() 또는 getStartPoint()).
  • 변환(move, rotate, scale, mirror, lengthen, reverse)은 수정된 엔티티를 반환합니다.
  • 기타 수정 함수(trim, round, bevel, offset, breakOut, autoTrim, divide, explode, stretch)는 도면에 적용된 트랜잭션을 반환하며, 작업이 실패한 경우 undefined를 반환합니다.
  • 엔티티 대신 도형을 전달하면 변환은 주어진 도형을 수정하고, 그 밖의 모든 함수는 결과 도형을 배열로 반환합니다.

실패한 작업은 오류를 발생시키지 않습니다. 대신 스크립트 셸에 “엔티티를 트리밍할 수 없습니다.“와 같은 경고가 표시됩니다.

addPoint(x, y)
addPoint([x, y])

주어진 위치에 점 엔티티를 추가합니다.

for (var i=0; i<10; i++) {
addPoint(i*10, 0);
}
addLine(x1, y1, x2, y2)
addLine([x1, y1], [x2, y2])

시작점에서 끝점까지 선을 추가합니다.

// 삼각형:
addLine(0,0, 100,0);
addLine(100,0, 50,80);
addLine(50,80, 0,0);
addXLine(x, y, dx, dy)
addXLine([x, y], [dx, dy])

기준점 x,y를 지나고 방향이 dx,dy인 무한선(구성선)을 추가합니다. 방향은 기준점을 기준으로 한 상대값으로 지정합니다.

// 0,0을 지나는 수평 및 45도 구성선:
addXLine(0,0, 1,0);
addXLine([0,0], [1,1]);
addArc(cx, cy, radius, startAngle, endAngle)
addArc(cx, cy, radius, startAngle, endAngle, reversed)
addArc([cx, cy], radius, startAngle, endAngle, reversed)

주어진 중심, 반지름, 시작 각도 및 끝 각도로 호를 추가합니다. 각도는 도 단위입니다. 호는 시작 각도에서 끝 각도까지 시계 반대 방향으로 그려지며, reversed가 true인 경우에는 시계 방향으로 그려집니다(선택 사항, 기본값은 false).

// 0도에서 90도까지의 4분의 1 호:
addArc(0,0, 50, 0, 90);
// 0도에서 90도까지 시계 방향 호(나머지 4분의 3):
addArc([0,0], 40, 0, 90, true);
addCircle(cx, cy, radius)
addCircle([cx, cy], radius)

주어진 중심과 반지름으로 원을 추가합니다.

// 동심원:
for (var r=10; r<=50; r+=10) {
addCircle(0,0, r);
}
addEllipse(cx, cy, mx, my, ratio, startParam, endParam, reversed)
addEllipse([cx, cy], [mx, my], ratio, startParam, endParam, reversed)

타원 또는 타원 호를 추가합니다. mx,my는 중심을 기준으로 한 장축의 끝점입니다. ratio는 단축과 장축의 비율입니다. startParam과 endParam은 타원이 시작하고 끝나는 위치를 나타내는 라디안 단위의 타원 매개변수입니다. 완전한 타원에는 0과 2*Math.PI를 사용합니다.

// 장반경 50, 단반경 25인 완전한 타원:
addEllipse(0,0, 50,0, 0.5, 0, 2*Math.PI, false);
// 회전된 타원의 위쪽 절반:
addEllipse([0,0], [30,30], 0.3, 0, Math.PI, false);
addPolyline(points, closed, relative)

주어진 버텍스를 지나는 폴리라인을 추가합니다. points는 버텍스의 배열이며, 각 버텍스는 [x, y], [x, y, bulge] 또는 [x, y, bulge, relative]로 지정합니다. x, y 대신 RVector를 사용할 수도 있습니다.

  • bulge는 이 버텍스에서 시작하는 세그먼트의 모양을 정의합니다. 0(기본값)은 직선 세그먼트, 1은 시계 반대 방향의 반원, -1은 시계 방향의 반원입니다. 그 밖의 값은 그 사이의 호 세그먼트를 생성합니다(벌지는 호 각도의 4분의 1에 대한 탄젠트입니다).
  • relative: 이 버텍스의 좌표가 이전 버텍스에 대한 상대 좌표이면 true.
  • closed: 폴리라인을 닫으려면 true(기본값은 false).
  • relative: 모든 버텍스의 좌표를 이전 버텍스에 대한 상대 좌표로 처리하려면 true(기본값은 false).
// 닫힌 직사각형:
addPolyline([[0,0], [100,0], [100,50], [0,50]], true);
// 반원 두 개로 된 슬롯 모양:
addPolyline([[0,60], [80,60,1], [80,80], [0,80,1]], true);
// 상대 좌표를 사용한 지그재그 선:
addPolyline([[0,100], [10,10], [10,-10], [10,10], [10,-10]], false, true);
addSpline(fitPoints, closed)

주어진 맞춤점을 지나는 스플라인을 추가합니다. fitPoints는 [x, y] 배열 또는 RVector 객체의 배열입니다. closed가 true이면 스플라인이 닫힙니다(주기적).

// 열린 스플라인:
addSpline([[0,0], [30,40], [60,0], [90,40]], false);
// 닫힌 스플라인:
addSpline([[0,60], [40,80], [80,60], [40,100]], true);

튜토리얼 파일에서 스크립트 실행하기에서는 리사주 곡선을 스플라인으로 플롯하는 또 다른 예제를 보여 줍니다.

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)

주어진 위치에 한 줄 텍스트를 추가합니다. 위치 뒤의 모든 인수는 선택 사항입니다.

  • height: 텍스트 높이(기본값 1)
  • angle: 도 단위의 텍스트 각도(기본값 0)
  • font: 글꼴 이름(기본값 "Standard")
  • vAlign: 수직 정렬: RS.VAlignTop(기본값), RS.VAlignMiddle, RS.VAlignBase 또는 RS.VAlignBottom
  • hAlign: 수평 정렬: RS.HAlignLeft(기본값), RS.HAlignCenter 또는 RS.HAlignRight
  • bold, italic: 굵게 또는 기울임꼴 텍스트로 하려면 true(TrueType 글꼴만 해당)
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(x1, y1, x2, y2, x3, y3, x4, y4)
addSolid([x1, y1], [x2, y2], [x3, y3], [x4, y4])

꼭짓점이 세 개 또는 네 개인 솔리드 채우기 영역을 추가합니다. 네 꼭짓점 솔리드의 꼭짓점은 지그재그 순서로 지정한다는 점에 유의하십시오. 즉, 첫 번째 꼭짓점, 두 번째 꼭짓점, 그다음 두 번째 꼭짓점의 맞은편 꼭짓점, 마지막으로 첫 번째 꼭짓점의 맞은편 꼭짓점 순서입니다. 삼각형을 만들려면 세 번째 꼭짓점을 두 번 전달합니다.

// 채워진 정사각형:
addSolid(0,0, 50,0, 0,50, 50,50);
// 채워진 삼각형:
addSolid([60,0], [110,0], [85,50], [85,50]);

다음 함수는 전체 QCAD API로 생성한 객체를 도면에 추가합니다. 위의 전용 생성 함수로 처리할 수 없는 경우에 유용합니다.

addShape(shape)
addShape(shape, color, linetype, lineweight)

주어진 도형(RLine, RArc, RCircle, REllipse, RPolyline, RSpline, RPoint 등)을 현재 레이어에 새 엔티티로 추가합니다. 선택적으로 색상(RColor), 라인 타입(이름 또는 ID) 및 선 무게(예: RLineweight.Weight050)를 지정할 수 있습니다. 기본적으로 현재 색상, 라인 타입 ByLayer 및 선 무게 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(shapes)

주어진 배열의 모든 도형을 새 엔티티로 추가합니다.

var shapes = [];
for (var i=0; i<5; i++) {
shapes.push(new RCircle(new RVector(i*20, 0), 8));
}
addShapes(shapes);
addEntity(entity)
addEntity(entity, color, linetype, lineweight)

주어진 엔티티(REntity)를 도면에 추가합니다. 색상을 지정하지 않으면 현재 색상이 사용됩니다.

var doc = getDocument();
var data = new RLineData(new RVector(0,0), new RVector(100,50));
var entity = new RLineEntity(doc, data);
addEntity(entity);
addObject(object)

임의의 객체(엔티티, 레이어, 블록 등)를 도면에 추가하고 추가된 객체를 반환합니다.

// 십자가 들어 있는 "Marker"라는 블록 추가:
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);
// 블록을 두 번 삽입:
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(object)

주어진 객체를 도면에서 삭제합니다. 엔티티를 삭제할 때는 일반적으로 deleteEntity 함수가 더 편리합니다.

var line = addLine(0,0, 100,0);
deleteObject(line);
addLayer(name)
addLayer(name, color, linetype, lineweight)

주어진 이름으로 새 레이어를 추가합니다. 선택적으로 색상 이름(기본값 "white", 흰색 배경에서는 검은색으로 표시됨), 라인 타입 이름(기본값 "CONTINUOUS") 및 선 무게(기본값 RLineweight.Weight000)를 지정할 수 있습니다. 새 레이어를 반환하며, 주어진 이름의 레이어가 이미 있으면 undefined를 반환합니다.

addLayer("Construction", "gray", "DASHED");
addLayer("Contour", "blue", "CONTINUOUS", RLineweight.Weight050);
hasLayer(name)

주어진 이름의 레이어가 도면에 있으면 true를 반환합니다.

if (!hasLayer("Holes")) {
addLayer("Holes", "red");
}
setCurrentLayer(name)

현재 레이어를 설정합니다. 이후에 추가되는 모든 엔티티는 이 레이어에 배치됩니다.

addLayer("Holes", "red");
setCurrentLayer("Holes");
addCircle(0,0, 5);
addCircle(50,0, 5);
setCurrentLayer("0");
setCurrentColor(color)
setCurrentColor(r, g, b)

이후에 추가되는 엔티티의 색상을 설정합니다. 색상은 RColor 객체 또는 빨강, 초록, 파랑 값(0-255)으로 지정할 수 있습니다. 색상을 “레이어별”로 되돌리려면 new RColor(RColor.ByLayer)를 사용합니다.

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);
getEntity(id)
getEntity(entity)
getEntity(x, y)
getEntity([x, y])

주어진 엔티티 참조에 해당하는 엔티티, 즉 주어진 ID를 가진 엔티티, 주어진 엔티티의 현재 상태 또는 주어진 위치에 가장 가까운 엔티티를 반환합니다. 엔티티를 찾지 못하면 undefined를 반환합니다.

var circle = addCircle(0,0, 20);
move(circle, [10,0]);
// circle은 여전히 이전 중심을 가지고 있고, getEntity는 현재 상태를 반환:
getEntity(circle).getCenter(); // 10,0 반환
// 30,0에 가장 가까운 엔티티:
getEntity(30,0).getRadius(); // 20 반환
getShape(id)
getShape(entity)
getShape(x, y)
getShape([x, y])

주어진 엔티티의 지오메트리를 도형으로 반환합니다(선의 경우 RLine, 호의 경우 RArc, 폴리라인의 경우 RPolyline 등). 도형을 사용하면 도면을 변경하지 않고 기하학적 계산을 할 수 있습니다.

addPolyline([[0,0], [100,0], [100,50]], false);
var pl = getShape(50,0);
pl.getLength(); // 150 반환
getClosestEntity(x, y)
getClosestEntity([x, y], range)

주어진 위치에 가장 가까운 엔티티를 반환합니다. range를 지정하면 그 위치로부터 해당 거리 이내에 있는 엔티티만 고려합니다. 엔티티를 찾지 못하면 undefined를 반환합니다.

addLine(0,0, 100,0);
addLine(0,50, 100,50);
getClosestEntity(50,10).getStartPoint(); // 0,0 반환
getClosestEntity([50,25], 5); // undefined 반환
getEntityShape(entity, position)

주어진 엔티티 객체의 도형을 반환합니다. 여러 도형으로 구성된 복합 엔티티(블록 참조, 해치, 치수, 텍스트)의 경우 주어진 위치에 가장 가까운 도형이 반환됩니다. 위치는 선택 사항입니다.

// 직사각형이 들어 있는 블록의 블록 참조:
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)));
// 40,10 근처에 있는 블록 참조의 도형(직사각형):
var s = getEntityShape(getEntity(ref), new RVector(41,10));
s.getLength(); // 120 반환
getIntersectionPoints(entity1, entity2)
getIntersectionPoints(entity1, entity2, limited)

주어진 두 엔티티 또는 도형의 교차점이 담긴 배열을 반환합니다. 엔티티는 엔티티 객체, 엔티티 ID 또는 도형으로 지정할 수 있습니다. limited가 false이면 엔티티를 무한한 것처럼 취급합니다(선은 연장되고 호는 완전한 원으로 취급). 기본값은 true입니다.

var line = addLine(-50,0, 50,0);
var circle = addCircle(0,0, 30);
var ips = getIntersectionPoints(line, circle);
// 교차점을 작은 원으로 표시:
for (var i=0; i<ips.length; i++) {
addCircle(ips[i], 2);
}
isPosition(value)
toVector(value)

isPosition은 주어진 값이 위치(RVector 또는 두세 개의 숫자로 된 배열)이면 true를 반환합니다. toVector는 배열로 주어진 위치를 RVector로 변환합니다. 이 함수들은 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]); // true 반환
isPosition("abc"); // false 반환
move(entity, dx, dy)
move(entity, [dx, dy])

주어진 엔티티를 주어진 변위만큼 이동합니다.

var c = addCircle(0,0, 10);
move(c, 50,0);
rotate(entity, angle)
rotate(entity, angle, cx, cy)
rotate(entity, angle, [cx, cy])

주어진 엔티티를 주어진 중심을 기준으로 주어진 각도(도 단위)만큼 회전합니다. 중심을 지정하지 않으면 엔티티는 원점 0,0을 기준으로 회전합니다.

// 0,0을 기준으로 회전한 부채꼴 모양의 선:
for (var a=0; a<360; a+=30) {
var l = addLine(10,0, 50,0);
rotate(l, a);
}
// 정사각형을 그 중심을 기준으로 회전:
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])

주어진 엔티티를 주어진 배율로 스케일합니다. 초점(제자리에 유지되는 점)의 기본값은 원점 0,0입니다. X와 Y에 서로 다른 배율을 배열 [sx, sy]로 지정할 수 있습니다. 원과 호 같은 일부 엔티티는 X와 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(entity, x1, y1, x2, y2)
mirror(entity, [x1, y1], [x2, y2])
mirror(entity, new RLine(...))

두 점으로 정의된 축을 기준으로 주어진 엔티티를 대칭 이동합니다.

var pl = addPolyline([[10,0], [40,0], [40,30]], false);
// Y축을 기준으로 대칭:
mirror(pl, 0,0, 0,100);

원본을 유지하고 대칭 복사본을 만들려면 먼저 엔티티의 복사본을 추가합니다.

var arc = addArc(20,0, 10, 0, 180);
var copy = addShape(getShape(arc));
mirror(copy, [0,-10], [0,10]);
trim(trimEntity, limitingEntity)
trim(trimEntity, trimPos, limitingEntity, limitingPos)
trim(trimEntity, trimPos, limitingEntity, limitingPos, trimBoth)
trim(trimPos, limitingPos)

엔티티 trimEntity를 제한 엔티티 limitingEntity까지 트림합니다. 트림되는 엔티티에서 클릭 위치 trimPos에 있는 부분이 유지됩니다. 두 엔티티가 교차하지 않으면 엔티티가 제한 엔티티까지 연장됩니다. 교차점이 여러 개이면 클릭 위치 limitingPos에 가장 가까운 교차점이 사용됩니다. trimBoth가 true이면 두 엔티티가 서로에 대해 트림됩니다.

var line = addLine(0,0, 100,0);
var limit = addLine(70,-20, 70,20);
// 왼쪽 부분 유지, 이제 line은 70,0에서 끝남:
trim(line, [10,0], limit);
// 선을 원까지 연장:
var line = addLine(0,0, 50,0);
var circle = addCircle(100,0, 20);
// 80,0에 가장 가까운 원과의 교차점까지 연장:
trim(line, [25,0], circle, [80,0]); // 이제 line은 80,0에서 끝남
trimBoth(entity1, entity2)
trimBoth(entity1, pos1, entity2, pos2)
trimBoth(pos1, pos2)

두 엔티티를 교차점까지 트림하거나 연장합니다. trimBoth를 true로 설정한 trim의 단축 함수입니다.

// 서로 닿지 않는 두 선을 연장하여 100,0에 모서리를 만듦:
var a = addLine(0,0, 80,0);
var b = addLine(100,20, 100,100);
trimBoth(a, b);
lengthen(entity, amount)
lengthen(entity, start, amount)
lengthen(entity, pos, amount)
lengthen(pos, amount)

주어진 엔티티를 주어진 양만큼 늘립니다. 음수 값을 지정하면 엔티티가 줄어듭니다. 기본적으로 엔티티는 끝점에서 늘어납니다. 대신 시작점에서 늘리려면 start에 true를 전달하거나, 늘릴 끝 근처의 위치를 전달합니다.

var line = addLine(0,0, 100,0);
lengthen(line, 20); // 이제 line은 120,0에서 끝남
lengthen(line, true, -10); // 이제 line은 10,0에서 시작함
var arc = addArc(0,50, 30, 0, 90);
lengthen(arc, [30,50], 10); // 호를 시작점에서 늘림
breakOut(entity, pos)
breakOut(entity, pos, removeSegment)
breakOut(pos)

주어진 위치에서 주어진 엔티티의 세그먼트를 브레이크 아웃합니다. 세그먼트는 그 위치 양쪽에서 다른 엔티티와 만나는 가장 가까운 교차점에서 끝납니다. 한쪽에 교차점이 없으면 세그먼트는 엔티티의 끝까지 이어집니다. removeSegment가 true(기본값)이면 세그먼트가 삭제됩니다. 그렇지 않으면 별도의 엔티티로 유지됩니다.

var line = addLine(0,0, 100,0);
addLine(30,-10, 30,10);
addLine(70,-10, 70,10);
// 30,0과 70,0 사이의 선 부분 제거:
breakOut(line, [50,0]);
autoTrim(entity, pos)
autoTrim(pos)

breakOut의 반대입니다. 주어진 위치에서 주어진 엔티티의 세그먼트만 유지하고 나머지는 제거합니다. 세그먼트는 그 위치 양쪽에서 다른 엔티티와 만나는 가장 가까운 교차점에서 끝납니다.

var line = addLine(0,0, 100,0);
addLine(30,-10, 30,10);
addLine(70,-10, 70,10);
// 30,0과 70,0 사이의 부분만 유지:
autoTrim(line, [50,0]);
divide(entity, pos)
divide(entity, pos1, pos2)
divide(pos)

주어진 엔티티를 주어진 위치에서 나눕니다. 열린 엔티티(선, 호, 열린 폴리라인 등)는 위치가 하나이면 두 부분으로, 위치가 둘이면 세 부분으로 나뉩니다. 닫힌 엔티티(원, 완전한 타원, 닫힌 폴리라인)는 두 위치가 필요하며 두 부분으로 나뉩니다.

var line = addLine(0,0, 100,0);
divide(line, [40,0]); // 두 선: 0..40 및 40..100
var circle = addCircle(0,50, 20);
divide(circle, [20,50], [-20,50]); // 두 반원
round(entity1, entity2, radius)
round(entity1, pos1, entity2, pos2, radius)
round(entity1, pos1, entity2, pos2, radius, trim)
round(pos1, pos2, radius)

두 엔티티 사이의 모서리를 주어진 반지름의 호로 둥글게 합니다(모깎기). 클릭 위치는 엔티티의 어느 끝을 라운드할지 나타냅니다. trim이 true(기본값)이면 두 엔티티가 라운드 호까지 트림됩니다.

// 모서리가 라운드된 직사각형:
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);

같은 폴리라인을 두 번 전달하고 두 세그먼트 각각에 클릭 위치를 지정하면 폴리라인의 모서리도 라운드할 수 있습니다.

var pl = addPolyline([[0,0], [100,0], [100,50]], false);
round(pl, [50,0], pl, [100,25], 10);
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)

두 엔티티 사이의 모서리를 직선으로 모따기합니다(챔퍼). distance1은 첫 번째 엔티티를 따라 모서리에서 모따기 선까지의 거리이고, distance2는 두 번째 엔티티를 따른 거리입니다(기본값은 distance1). trim이 true(기본값)이면 두 엔티티가 모따기 선까지 트림됩니다. chamfer는 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(entity, distance)
offset(entity, distance, number)
offset(entity, distance, number, side)
offset(entity, sidePos, distance)
offset(entity, sidePos, distance, number)

선에 대해서는 평행선을, 호와 원에 대해서는 동심 호와 동심원을, 타원 및 기타 엔티티에 대해서는 오프셋 곡선을 생성합니다. number는 생성할 평행선의 개수입니다(기본값 1). 방향을 지정하지 않으면 평행선은 엔티티의 양쪽에 생성됩니다. 방향은 엔티티 옆의 위치 sidePos로 지정하거나 side(RS.LeftHand, RS.RightHand 또는 RS.BothSides)로 지정합니다. 폴리라인과 스플라인의 오프셋은 QCAD Professional에서만 사용할 수 있습니다.

var line = addLine(0,0, 100,0);
offset(line, 5); // 양쪽에 평행선 하나씩
var line2 = addLine(0,30, 100,30);
offset(line2, 5, 2, RS.LeftHand); // 왼쪽(위쪽)에 평행선 두 개
var circle = addCircle(50,80, 10);
offset(circle, [50,95], 3, 4); // 바깥쪽에 동심원 네 개
reverse(entity)
reverse(x, y)

주어진 엔티티의 방향을 반전합니다. 즉, 시작점과 끝점을 서로 바꿉니다.

var line = addLine(0,0, 100,0);
line = reverse(line);
line.getStartPoint(); // 100,0 반환
explode(entity)
explode(entity, options)
explode(x, y)

주어진 엔티티를 더 단순한 엔티티로 분해합니다. 폴리라인은 선과 호로, 블록 참조는 그 내용으로, 텍스트는 선과 스플라인으로, 치수와 해치는 선, 호 등으로 분해됩니다. 원래 엔티티는 삭제됩니다.

options는 선택적 객체로, 일반적으로 애플리케이션 기본 설정에서 가져오는 설정을 지정합니다. 예: { splineSegments: 64, textToPolylines: true }. 지원되는 옵션은 splineTolerance, splineSegments, ellipseSegments, splinesToLineSegments, textToPolylines, textSplineToLineOrArc, multilineTextToSimpleText 및 circlesToPolylines입니다.

var pl = addPolyline([[0,0], [100,0,1], [100,50], [0,50]], true);
explode(pl); // 선 세 개와 호 하나
stretch(x1, y1, x2, y2, dx, dy)
stretch([x1, y1], [x2, y2], [dx, dy])
stretch(area, offset)

두 모서리로 정의된 직사각형 영역 안의 모든 엔티티를 주어진 변위만큼 스트레칭합니다. 영역 안에 완전히 들어 있는 엔티티는 이동되고, 영역의 경계를 가로지르는 엔티티는 스트레칭됩니다(영역 안에 있는 끝점만 이동됨). 영역은 RBox 또는 닫힌 RPolyline 도형으로 지정할 수도 있습니다. 도면에서 엔티티가 선택되어 있으면 선택된 엔티티만 스트레칭됩니다.

// 선으로 만든 직사각형:
addLine(0,0, 100,0);
addLine(100,0, 100,50);
addLine(100,50, 0,50);
addLine(0,50, 0,0);
// 오른쪽 변을 스트레칭하여 직사각형을 50단위 더 넓게 만듦:
stretch([80,-10], [120,60], [50,0]);
deleteEntity(entity)
deleteEntity(id)
deleteEntity(x, y)

주어진 엔티티를 도면에서 삭제합니다.

var l1 = addLine(0,0, 100,0);
var l2 = addLine(0,10, 100,10);
addLine(0,20, 100,20);
deleteEntity(l1); // 엔티티로
deleteEntity(l2.getId()); // 엔티티 ID로
deleteEntity(50,20); // 위치로
paste(sourceDocument, destination, offset, scale, rotation,
flipHorizontal, flipVertical, toCurrentLayer, overwriteLayers, overwriteBlocks)

문서 sourceDocument의 내용을 문서 인터페이스 destination에 붙여넣거나, destination이 undefined이면 현재 도면에 붙여넣습니다. 붙여넣은 내용은 offset만큼 이동되고, scale만큼 스케일되며, rotation도만큼 회전됩니다. 모든 인수는 필수입니다.

  • flipHorizontal, flipVertical: 내용을 뒤집으려면 true
  • toCurrentLayer: 모든 엔티티를 현재 레이어에 붙여넣으려면 true
  • overwriteLayers, overwriteBlocks: 이름이 같은 기존 레이어나 블록을 덮어쓰려면 true
// 오프스크린 문서에 심볼 생성:
var symbol = createDocument();
startTransaction(symbol);
addCircle(0,0, 10);
addLine(-10,0, 10,0);
addLine(0,-10, 0,10);
endTransaction();
// 현재 도면에 세 번 붙여넣기:
for (var i=0; i<3; i++) {
paste(symbol, undefined, [i*50, 0], 1+i*0.5, i*15, false, false, false, false, false);
}
startTransaction()
startTransaction(document)
endTransaction()

기본적으로 모든 Simple API 호출은 즉시 도면에 적용되며 개별적으로 실행 취소할 수 있습니다. startTransaction()과 endTransaction() 사이에서는 모든 변경 사항이 수집되었다가 endTransaction이 호출될 때 한꺼번에 적용됩니다. 여기에는 두 가지 장점이 있습니다.

  • 많은 엔티티를 추가할 때 훨씬 빠릅니다.
  • 모든 변경 사항을 한 번에 실행 취소할 수 있습니다.

문서(RDocument) 또는 문서 인터페이스(RDocumentInterface)를 startTransaction에 전달하면 모든 변경 사항이 현재 도면 대신 해당 문서에 적용됩니다. 이는 예를 들어 파일로 내보내기 위해 백그라운드에서 도면을 생성할 때 유용합니다(createDocumentInterface 참조).

startTransaction();
for (var x=0; x<=200; x+=10) {
for (var y=0; y<=200; y+=10) {
addPoint(x, y);
}
}
endTransaction();

트랜잭션으로 작업할 때는 다음 사항에 유의하십시오.

  • 트랜잭션 안에서는 변경 사항이 아직 도면에 포함되지 않습니다. trim이나 round 같은 수정 함수는 같은 트랜잭션에서 추가된 엔티티를 참조할 수 없습니다.
  • 트랜잭션 안에서 생성 함수가 반환하는 엔티티는 endTransaction 이후에도 유효한 ID를 갖지 않습니다. 나중에 이러한 엔티티를 수정하려면 위치로 참조하십시오.
  • 트랜잭션 안에서 추가된 모든 엔티티는 endTransaction이 호출될 때의 현재 레이어에 배치됩니다. 트랜잭션을 시작하기 전에 현재 레이어를 설정하고, 레이어마다 별도의 트랜잭션을 사용하십시오.
startTransaction();
addLine(0,0, 100,0);
addLine(100,0, 100,50);
endTransaction();
// 새 선들을 위치로 참조하여 모서리를 라운드:
round([50,0], [100,25], 10);

getTransactionDocument 및 getTransactionDocumentInterface

섹션 제목: “getTransactionDocument 및 getTransactionDocumentInterface”
getTransactionDocument()
getTransactionDocumentInterface()

현재 트랜잭션이 적용되는 문서 또는 문서 인터페이스를 반환합니다. 트랜잭션 밖에서는 현재 문서와 문서 인터페이스가 반환됩니다.

var doc = createDocument();
startTransaction(doc);
addLine(0,0, 10,0);
getTransactionDocument() === doc; // true 반환
endTransaction();
getOperation()

현재 트랜잭션의 작업(RAddObjectsOperation)을 반환합니다. 트랜잭션 밖에서는 명시적으로 적용해야 하는 새 작업이 반환됩니다. 이는 예를 들어 Simple API 호출을 전체 QCAD API와 결합하는 등의 고급 용도를 위한 것입니다.

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

도면 전체가 보이도록 현재 뷰를 줌합니다.

addCircle(1000,1000, 500);
autoZoom();
zoomTo(entity)
zoomTo(entity, margin)
zoomTo([x1, y1], [x2, y2])
zoomTo([x1, y1], [x2, y2], margin)
zoomTo(box, margin)

주어진 엔티티, 도형 또는 직사각형 영역으로 줌합니다. margin은 영역 주위의 여백(픽셀 단위, 기본값 10)입니다.

addCircle(0,0, 100);
var small = addCircle(80,0, 2);
zoomTo(small, 50);
zoomTo([0,0], [100,100]);
getMainWindow()

QCAD 애플리케이션 창(RMainWindowQt)을 반환합니다.

getMainWindow().windowTitle;
getDocumentInterface()

현재 도면의 문서 인터페이스(RDocumentInterface)를 반환합니다. 문서 인터페이스는 문서를 해당 뷰와 연결하고, 파일 가져오기 및 내보내기, 작업 적용, 실행 취소 및 다시 실행을 위한 함수를 제공합니다.

addLine(0,0, 100,0);
getDocumentInterface().undo(); // 선을 다시 제거
getDocument()

현재 문서(RDocument)를 반환합니다. 문서는 도면의 모든 엔티티, 레이어, 블록 등을 보관하며 이를 조회하는 함수를 제공합니다.

addLine(0,0, 100,0);
addCircle(0,0, 10);
getDocument().queryAllEntities().length; // 도면에 있는 엔티티의 개수
getGraphicsView()

현재 도면의 현재 활성 뷰 또는 마지막으로 활성화된 뷰(RGraphicsView)를 반환합니다.

addCircle(0,0, 50);
getGraphicsView().autoZoom();
createDocument()

창에 표시되지 않는 비어 있는 새 문서를 메모리에 생성합니다. 이러한 오프스크린 문서는 트랜잭션을 사용하여 채운 다음 도면에 붙여넣을 수 있습니다(paste 참조).

var doc = createDocument();
startTransaction(doc);
addLine(0,0, 100,0);
addLine(100,0, 100,100);
endTransaction();
doc.queryAllEntities().length; // 2 반환
createDocumentInterface()

비어 있는 새 문서를 문서 인터페이스와 함께 메모리에 생성합니다. 문서 인터페이스를 사용하여 파일을 가져오거나 내보낼 수 있습니다.

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 및 isInputEnabled

섹션 제목: “disableInput, enableInput 및 isInputEnabled”
disableInput()
enableInput()
isInputEnabled()

disableInput은 예를 들어 오래 걸리는 작업이나 애니메이션 중에 사용자 입력을 막기 위해 QCAD 애플리케이션 창을 비활성화합니다. enableInput은 애플리케이션 창을 다시 활성화하며, isInputEnabled는 현재 사용자 입력이 활성화되어 있으면 true를 반환합니다. 스크립트가 끝날 때 반드시 입력을 다시 활성화하십시오.

update()

대기 중인 이벤트를 처리하여 오래 걸리는 작업 중에도 사용자 인터페이스가 업데이트되도록 합니다. update를 호출하기 전에 disableInput으로 사용자 입력을 비활성화해야 합니다.

sleep(milliseconds)

사용자 인터페이스를 최신 상태로 유지하면서 주어진 시간(밀리초 단위) 동안 스크립트를 일시 중지합니다. sleep을 호출하기 전에 disableInput으로 사용자 입력을 비활성화해야 합니다.

다음 예제는 disableInput, sleep 및 enableInput을 사용하여 간단한 애니메이션을 보여 줍니다.

disableInput();
var c = addCircle(0,0, 10);
autoZoom();
for (var i=0; i<20; i++) {
c = move(c, 5,0);
sleep(50);
}
enableInput();
warning(message)

경고 메시지를 표시합니다. 스크립트 셸에서는 경고가 명령 기록에 표시됩니다. 그렇지 않으면 경고가 콘솔에 출력됩니다.

if (getDocument().queryAllEntities().length===0) {
warning("The drawing is empty.");
}

다음 함수는 사용자에게 값을 묻는 간단한 대화 상자를 표시합니다. 사용자가 대화 상자를 취소하면 undefined가 반환됩니다.

getInt(title, prompt, value, step, min, max)

사용자에게 정수를 묻습니다. value는 초기값(기본값 0), step은 스핀 박스의 증분(기본값 1), min과 max는 허용 범위입니다.

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(title, prompt, value, decimals, min, max)

사용자에게 숫자를 묻습니다. value는 초기값(기본값 0), decimals는 표시되는 소수 자릿수(기본값 1), min과 max는 허용 범위입니다.

var r = getDouble("Circle", "Radius:", 25.0, 2, 0.01, 1000);
if (!isNull(r)) {
addCircle(0,0, r);
}
getText(title, prompt, text)

사용자에게 텍스트를 묻습니다. text는 초기 텍스트입니다(기본값은 빈 문자열).

var t = getText("Label", "Text:", "Hello");
if (!isNull(t)) {
addSimpleText(t, 0,0, 10);
}
getItem(title, prompt, items, index, separator)

사용자가 드롭다운 목록에서 항목을 선택하도록 합니다. items는 모든 항목을 separator(기본값 ",")로 구분한 문자열입니다. index는 처음에 선택되어 있는 항목의 인덱스입니다(기본값 0). 선택된 항목을 반환하며, 대화 상자가 취소되면 undefined를 반환합니다.

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);
}

이 예제는 Simple API의 여러 함수를 결합하여 피치원, 별도 레이어에 있는 볼트 구멍, 모서리를 라운드한 직사각형 컷아웃이 있는 플랜지를 그립니다.

addLayer("Center Lines", "gray", "CENTER");
addLayer("Holes", "red");
// 외곽선:
setCurrentLayer("0");
addCircle(0,0, 100);
// 피치원 및 중심선:
setCurrentLayer("Center Lines");
addCircle(0,0, 75);
addLine(-110,0, 110,0);
addLine(0,-110, 0,110);
// 하나의 트랜잭션으로 추가한 볼트 구멍:
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();
// 중앙에 모서리를 라운드한 정사각형 컷아웃:
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();

컷아웃의 선은 트랜잭션 없이 추가되므로 round에 바로 전달할 수 있습니다. 볼트 구멍은 트랜잭션 안에서 추가되므로 더 빠르고 한 번에 실행 취소할 수 있습니다.