선형
이 장은 AutoCAD Civil 3D .NET API 를 사용해서 선형, 측점, 그리고 선형스타일을 생성하고 사용하는 방법을 설명한다.
이 절의 주제
- 기본 선형 연산
- 측점
- 선형 스타일
- 샘플 프로그램
기본 선형 연산
이 절의 주제
- 선형 생성하기
- 앤터티를 사용해서 선형의 경로를 정의하기
- 선형내의 앤터티 결정하기
선형 생성하기
선형은 보통 기존 site와의 관련이 없이 생성된다. 각 CivilDocument object는 자신의 선형의 collection을 가지고 있는데, 그 collection은 GetSitelessAlignmentIds() 매서드로 접근된 site와의 관련이 없는 선형의 collection이다. GetAlignmentIds()매서드로 접근되는 모든 선형(site와 관련이 있거나 없는)의 collection도 있다. 선형은 Alignment.CopyToSite() 매서드로 site로 이동될 수 있다. siteless 선형은 sited 선형에서 Alignment.CopyToSite()를 사용하고 site값을 ObjectId.NULL이나 “”로 설정해서 복사될 수 있다.
새로운 선형 생성하기
Alignment 클래스는 Create() 매서드의 버전을 제공해하는데, polyline또는 geometry data 없이 새 Alignment object 를 생성한다. Geometry data 없이 선형을 생성하는 것은 2가지 추가사항이 있다. 둘 다 document object를 참조하고 새 선형의 이름을 취한다. 한가지는 선형과 연관지을 site의 ObjectIds(ObjectId.Null을 보내서 siteless 선형을 생성한 경우), 선형을 생성할 레이어, 선형에 적용할 스타일, 긜고 사용할 스타일을 설정할 레이블을 취한다. 다른 추가사항은 이 항목들의 이름을 지정하는 문자열을 취한다. 여기 간단한 샘플이 있다, 그 샘플은 geometry data 없이 siteless 선형을 만드는 샘플이다.
// Uses an existing Alignment Style named "Basic" and Label Set Style named "All Labels" (for example, from
// the _AutoCAD Civil 3D (Imperial) NCS.dwt template. This call will fail if the named styles
// don't exist.
// Uses layer 0, and no site (ObjectId.Null)
ObjectId testAlignmentID = Alignment.Create(doc, "New Alignment", ObjectId.Null, "0", "Basic", "All Labels");
// the _AutoCAD Civil 3D (Imperial) NCS.dwt template. This call will fail if the named styles
// don't exist.
// Uses layer 0, and no site (ObjectId.Null)
ObjectId testAlignmentID = Alignment.Create(doc, "New Alignment", ObjectId.Null, "0", "Basic", "All Labels");
Polyline을 통해서 선형을 생성하는 create() 매서드에는 2가지 추가사항이 있다. 첫번째는 CivilDocument object, PolylineOptions object, 새 선형의 이름, 그려질 레이어의 ObjectID, 선형 스타일의 ObjectID, 그리고 object가 설정된 레이블의 ObjectID의 참조를 취하고 새 선형의 ObjectID를 리턴한다. 두번째 추가사항은 레이어, 선형 스타일, 그리고 레이블 세트가 ObjectID대신 이름에 의해서 지정된다는 것을 제외하고는 동일하다.
이 코드는 2D polyline, 기존 스타일을 사용해서 선형을 생성한다.
[CommandMethod("CreateAlignment")]
public void CreateAlignment()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
// Ask the user to select a polyline to convert to an alignment
PromptEntityOptions opt = new PromptEntityOptions("\nSelect a polyline to convert to an Alignment");
opt.SetRejectMessage("\nObject must be a polyline.");
opt.AddAllowedClass(typeof(Polyline), false);
PromptEntityResult res = ed.GetEntity(opt);
// create some polyline options for creating the new alignment
PolylineOptions plops = new PolylineOptions();
plops.AddCurvesBetweenTangents = true;
plops.EraseExistingEntities = true;
plops.PlineId = res.ObjectId;
// uses an existing Alignment Style and Label Set Style named "Basic" (for example, from
// the Civil 3D (Imperial) NCS Base.dwt template. This call will fail if the named styles
// don't exist.
ObjectId testAlignmentID = Alignment.Create(doc, plops, "New Alignment", "0", "Standard", "Standard");
}
public void CreateAlignment()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
// Ask the user to select a polyline to convert to an alignment
PromptEntityOptions opt = new PromptEntityOptions("\nSelect a polyline to convert to an Alignment");
opt.SetRejectMessage("\nObject must be a polyline.");
opt.AddAllowedClass(typeof(Polyline), false);
PromptEntityResult res = ed.GetEntity(opt);
// create some polyline options for creating the new alignment
PolylineOptions plops = new PolylineOptions();
plops.AddCurvesBetweenTangents = true;
plops.EraseExistingEntities = true;
plops.PlineId = res.ObjectId;
// uses an existing Alignment Style and Label Set Style named "Basic" (for example, from
// the Civil 3D (Imperial) NCS Base.dwt template. This call will fail if the named styles
// don't exist.
ObjectId testAlignmentID = Alignment.Create(doc, plops, "New Alignment", "0", "Standard", "Standard");
}
다른 선형을 offset해서 선형 만들기
선형은 기존 선형의 배치를 기반으로 생성될 수도 있다. Alignment::CreateOffsetAlignment() 매서드는 offset 상수값으로 새 선형을 생성하고, 원래 선형처럼 동일한 부모 site에 추가한다. 새 선형은 같은 이름(괄호안의 숫자에 의해서 다음을 구분한다)을 가지고, 원래 선형과 같은 스타일을 가진다, 하지만, 측점 래이블, 측점 방정식, 설계속도는 기존 선형에서 상속하지 않는다.
[CommandMethod("CreateOffsetAlignment")]
public void CreateOffsetAlignment()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Ask the user to select an alignment to create a new offset alignment from
PromptEntityOptions opt = new PromptEntityOptions("\nSelect an Alignment");
opt.SetRejectMessage("\nObject must be an alignment.");
opt.AddAllowedClass(typeof(Alignment), false);
ObjectId alignID = ed.GetEntity(opt).ObjectId;
Alignment align = ts.GetObject(alignID, OpenMode.ForRead) as Alignment;
// Creates a new alignment with an offset of 10:
ObjectId offsetAlignmentID = align.CreateOffsetAlignment(10.0);
}
}
public void CreateOffsetAlignment()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Ask the user to select an alignment to create a new offset alignment from
PromptEntityOptions opt = new PromptEntityOptions("\nSelect an Alignment");
opt.SetRejectMessage("\nObject must be an alignment.");
opt.AddAllowedClass(typeof(Alignment), false);
ObjectId alignID = ed.GetEntity(opt).ObjectId;
Alignment align = ts.GetObject(alignID, OpenMode.ForRead) as Alignment;
// Creates a new alignment with an offset of 10:
ObjectId offsetAlignmentID = align.CreateOffsetAlignment(10.0);
}
}
Entity를 사용해서 선형의 경로를 정의하기
선형은 다양한 entity로 만들어 지고, 그 entity는 line, curve, spiral로 구분되고 그것들은 선형의 경로를 구성한다. Entity의 collection은 Alignment::Entities property에 있고, 그 collection은 AlignmentEntityCollection object이다. 이 collection은 새 entity를 만들기 위한 매서드를 다양하게 가지고 있다.
여기서 짧은 코드 조각이 있는데, 선형의 entity collection에 FixedCurve entity를 추가하는 매서드중 하나를 나타내는 코드 조각 이다.
Int32 previousEntityId = 0;
Point3d startPoint = new Point3d(8800.7906, 13098.1946, 0.0000);
Point3d middlePoint = new Point3d(8841.9624, 13108.6382, 0.0000);
Point3d endPoint = new Point3d(8874.2664, 13089.3333, 0.0000);
AlignmentArc retVal = myAlignment.Entities.AddFixedCurve(previousEntityId, startPoint, middlePoint, endPoint);
Point3d startPoint = new Point3d(8800.7906, 13098.1946, 0.0000);
Point3d middlePoint = new Point3d(8841.9624, 13108.6382, 0.0000);
Point3d endPoint = new Point3d(8874.2664, 13089.3333, 0.0000);
AlignmentArc retVal = myAlignment.Entities.AddFixedCurve(previousEntityId, startPoint, middlePoint, endPoint);
선형에 있는 entity 결정하기
Alignment::Entities에 있는 각각의 entity는 Alignment::AlignmentEntity 클래스에서 상속된 타입이다. AlignmentEntity.Entity Type propery를 체크해서, 각각의 entity의 특정타입을 결정할 수 있고, 올바른 type으로 참조를 형변환 할 수 있다.
다음 샘플은 선형에 있는 모든 entity 를 반복하고, entity의 타입을 결정하고, 그 속성중 하나를 출력한다.
[CommandMethod("EntityProperties")]
public void EntityProperties()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Ask the user to select an alignment to get info about
PromptEntityOptions opt = new PromptEntityOptions("\nSelect an Alignment");
opt.SetRejectMessage("\nObject must be an alignment.");
opt.AddAllowedClass(typeof(Alignment), false);
ObjectId alignID = ed.GetEntity(opt).ObjectId;
Alignment align = ts.GetObject(alignID, OpenMode.ForRead) as Alignment;
int i = 0;
// iterate through each Entity and check its type
foreach (AlignmentEntity myAe in align.Entities){
i++;
String msg = "";
switch (myAe.EntityType)
{
case AlignmentEntityType.Arc:
AlignmentArc myArc = myAe as AlignmentArc;
msg = String.Format("Entity{0} is an Arc, length: {1}\n", i, myArc.Length);
break;
case AlignmentEntityType.Spiral:
AlignmentSpiral mySpiral = myAe as AlignmentSpiral;
msg = String.Format("Entity{0} is a Spiral, length: {1}\n", i, mySpiral.Length);
break;
// we could detect other entity types as well, such as
// Tangent, SpiralCurve, SpiralSpiral, etc.
default:
msg = String.Format("Entity{0} is not a spiral or arc.\n", i);
break;
}
// write out the Entity information
ed.WriteMessage(msg);
}
}
}
public void EntityProperties()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Ask the user to select an alignment to get info about
PromptEntityOptions opt = new PromptEntityOptions("\nSelect an Alignment");
opt.SetRejectMessage("\nObject must be an alignment.");
opt.AddAllowedClass(typeof(Alignment), false);
ObjectId alignID = ed.GetEntity(opt).ObjectId;
Alignment align = ts.GetObject(alignID, OpenMode.ForRead) as Alignment;
int i = 0;
// iterate through each Entity and check its type
foreach (AlignmentEntity myAe in align.Entities){
i++;
String msg = "";
switch (myAe.EntityType)
{
case AlignmentEntityType.Arc:
AlignmentArc myArc = myAe as AlignmentArc;
msg = String.Format("Entity{0} is an Arc, length: {1}\n", i, myArc.Length);
break;
case AlignmentEntityType.Spiral:
AlignmentSpiral mySpiral = myAe as AlignmentSpiral;
msg = String.Format("Entity{0} is a Spiral, length: {1}\n", i, mySpiral.Length);
break;
// we could detect other entity types as well, such as
// Tangent, SpiralCurve, SpiralSpiral, etc.
default:
msg = String.Format("Entity{0} is not a spiral or arc.\n", i);
break;
}
// write out the Entity information
ed.WriteMessage(msg);
}
}
}
각각의 entity는 AlignmentEntity.EntityId property에 포함된 유일한 번호를 가지고 있다. 각각의 entity는 선형에서의 entity의 이전과 이후의 번호를 알고 있다, 그리고 당신은 AlignmentEntityCollection.EntityAtId() 매서드를 사용해서 그 유일한 번호에 로 특정 entity를 접근할 수 있다.
이 절의 주제
- 측점 방정식으로 측점을 수정하기
- 측점 셋트를 생성하기
- 설계속도 지정하기
- 측점의 위치 찾기
- 편경사
측점 방정식으로 측점을 수정하기
측점은 선형의 시점에서 일정한 거리의 선형을 따르는 지점이다. 기본적으로 선형의 시작지점에 있는 측점은 0이고 그것의 길이를 따라서 연속적으로 증가한다. 이것은 측점 방정식을 사용해서 변경될 수 있는데, 방정식은 선형을 따르는 측점의 번호를 다시 매길 수 있다. 측점 방정식은 StationEquation 타입의 object인데, 이 object는 선형을 따르는 위치, 새로운 측점의 시작번호, 그리고 플래를 포함한다. 이 플래그는 측점 값들이 어떤 위치에서 증가해야 하는지 감소해야 하는지를 표시한다. 이런 측점 방정식의 collection은 Alignment::StationEquations property에 포함되어 있다.
다음 코드는 측점 방정식을 선형에 추가하는데, 이 방정식은 선형의 시작위치에서 80단위만큼 떨어진 점에서 시작하고 증가하는 값을 가진다.
StationEquation myStationEquation = myAlignment.StationEquations.Add(80, 0, StationEquationType.Increasing);
Note:
Alignment::DesignSpeedCollection::GetDesignSpeed() 같은 몇몇 함수들은 측점 방정식에 의해 만들어진 수정과 관련이 없는 “원시” 측점 값을 요구한다.
측점 세트 생성하기
선형 측점은 보통 일정한 간격으로 표시된다. 당신은 측점의 수, 위치, 그리고 기하학 정보를 계산할 수 있는데, Alignment::GetStationSet() 매서드를 사용해서 규측에 의한 간격에 생겨진 측점이다. 이 매서드의 역할은 요청한 측점의 타입에 기초해서 측점의 collection을 리턴하고, 옵션으로 메이저와 마이너 간격을 리턴한다.
// Get all the potential stations with major interval = 100, and minor interval = 20
// Print out the raw station number, type, and location
Station[] myStations = myAlignment.GetStationSet( StationType.All,100,20);
ed.WriteMessage("Number of possible stations: {0}\n", myStations.Length);
foreach (Station myStation in myStations){
ed.WriteMessage("Station {0} is type {1} and at {2}\n", myStation.RawStation, myStation.StnType.ToString(), myStation.Location.ToString());
}
// Print out the raw station number, type, and location
Station[] myStations = myAlignment.GetStationSet( StationType.All,100,20);
ed.WriteMessage("Number of possible stations: {0}\n", myStations.Length);
foreach (Station myStation in myStations){
ed.WriteMessage("Station {0} is type {1} and at {2}\n", myStation.RawStation, myStation.StnType.ToString(), myStation.Location.ToString());
}
설계 속도 지정하기
당신은 선형의 길이를 따라서 설계 속도를 할당 해서 선형에 기반한 도로 설계를 지원할 수 있다. 이 선형을 따르는 speeds collection은 Alignment::DesignSpeedsproperty에 포함되어 있다. 그 collection에 있는 각각의 항목은 DesignSpeed 타입의 object인데, 이 object는 원시 측점 값, 측점에서 사용된 속도를 포함한다. 이 속도는 측점에서 사용된 속도이고 다음 지정된 설계속도 또는 선형의 끝까지 이다. 그리고 설계속도 수와 옵션으로 문자열 주석을 포함한다.
// Starting at station 0 + 00.00
DesignSpeed myDesignSpeed = myAlignment.DesignSpeeds.Add(0, 45);
myDesignSpeed.Comment = "Straigtaway";
// Starting at station 4 + 30.00
myDesignSpeed = myAlignment.DesignSpeeds.Add(430, 30);
myDesignSpeed.Comment = "Start of curve";
// Starting at station 14 + 27.131 to the end
myDesignSpeed = myAlignment.DesignSpeeds.Add(1427.131, 35);
myDesignSpeed.Comment = "End of curve";
// make alignment design speed-based:
myAlignment.UseDesignSpeed = true;
DesignSpeed myDesignSpeed = myAlignment.DesignSpeeds.Add(0, 45);
myDesignSpeed.Comment = "Straigtaway";
// Starting at station 4 + 30.00
myDesignSpeed = myAlignment.DesignSpeeds.Add(430, 30);
myDesignSpeed.Comment = "Start of curve";
// Starting at station 14 + 27.131 to the end
myDesignSpeed = myAlignment.DesignSpeeds.Add(1427.131, 35);
myDesignSpeed.Comment = "End of curve";
// make alignment design speed-based:
myAlignment.UseDesignSpeed = true;
측점의 위치 찾기
당신은 Alignment::PointLocation() 매서드를 사용해서 측점과 선형에서 offset된 점의 좌표를 찾을 수 있다. 가장 간단한 매서드의 버전은 측점과 offset값을 취한다, 북향과 동향(매개변수 참조로)을 리턴한다.
이 매서드의 다른 버전은 측점, offset 그리고 정밀도를 취하고, 북향, 동향 그리고 방위각(매개변수 참조로)을 리턴한다. 정밀도는 선형 entity인 점을 리턴하는 방법을 결정한다. 만약 정밀도가 원하는 측점 - 선형 entity transition에 있는 측점보다 크다면, 그점은 entity에 표시될 것이다. 예를들어, 선형이 접선(길이 240)과 곡선(길이 260)으로 만들어 졌다고 가정하자. 정밀도 = 0 으로 측점 400의 위치를 찾기는 curve위의 점을 찾을 것이다. 하지만, 정밀도가 200이면 접선에 점을 보고할 것이다, 왜냐하면 400 - 240 < 200 보다 작기 때문이다.
편경사
선형의 어떤 측점에 적용할 수 있는 다른 셋팅은 편경사다. 편경사는 도로 component의 각도를 조절하는데 사용된다. 이 component는 선형을 기반으로한 corridor를 위한 것이다. 안쪽과 바깥쪽 길어깨와 도로면은 도로의 왼쪽과 오른쪽 모두를 위해서 조절 될 수 있다.
Note:
편경사 기능은 AutoCAD Civil 3D 2011에서 대체로 변경되었었다, 그리고 API 또한 변화가 있다. Alignment::SuperelevationData property와 Alignment::SuperElevationAtStation() 매서드는 삭제되었다. 기존 코드는 변경해서 새 API를 사용하고, Alignment::SuperelevationCurves, Alignment::SuperelevationCriticalStations와 SuperelevationCriticalStationCollection::GetCriticalStationAt() 을 통해서 접근해야 한다.
선형의 편경사 데이타는 편경사 곡선이라 불리는 분리된 곡선으로 구분 되어 있고, 각각의 편경사 곡선은 변화구간을 포함한다. 이 변화 구간은 편경사 변화가 normal 에서 full 편경사 그리고 역방향으로 변경되는 구간이다.(편경사의 안쪽과 바깥쪽 변화구간은 분리되어 있다). 이 구간은 “critical stations”으로 정의되거나 도로 횡단면에서 변화가 있는 측점에 의해서 정의된다. 선형의 편경사 곡선의 collection은 Alignment::SuperelevationCurve property로 접근되고, 모든 곡선의 모든 critical station은 Alignment::SuperelevationCriticalStation property로 접근된다. SuperelevationCurves collection은 편경사 곡선이 선형에 추가된 적이 없다면 비어 있다(수도 또는 편경사 위저드에 의해서 계산되는 경우도 해당됨). 만약 곡선을 위해서 계산된 편경사 데이타가 없다면 SuperelevationCriticalStations collection은 선형의 시작과 끝 측점을 위한 기본 entity를 포함한다.
각각의 SuperelevationCriticalStation은 Alignment::SuperelevationCriticalStations::GetCriticalStationAt() 매서드를 통해서 접근할 수 있다.
이 코드 조각에서, 선형의 편경사 곡선의 collection은 반복된다, 그리고 각 곡선에 있는 각각의 critical 측점에 대한 정보가 출력된다. 당신은 경사나 부드러운 길이를 가져오려면 횡단 세그먼트 타입을 지정해야 한다느 것을 기억하라, 하지만, 어느 세그먼트 타입이 critical 측점에 유요한지 모를 수도 있다. 이 조각에서, 코드는 모든 세그먼트 타입을 가져오는 시도를 하고, 유효하지 않은 타입을 위한 InvalidOperationException 예외를 캐치한다.
[CommandMethod("GetSECurves")]
public void GetSECurves()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// get first alignment:
ObjectId alignID = doc.GetAlignmentIds()[0];
Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForRead) as Alignment;
if (myAlignment.SuperelevationCurves.Count < 1)
{
ed.WriteMessage("You must calculate superelevation data.\n");
return;
}
foreach (SuperelevationCurve sec in myAlignment.SuperelevationCurves)
{
ed.WriteMessage("Name: {0}\n", sec.Name);
ed.WriteMessage(" Start: {0} End: {1}\n", sec.StartStation, sec.EndStation);
foreach (SuperelevationCriticalStation sest in sec.CriticalStations)
{
ed.WriteMessage(" Critical station: {0} {1} {2}\n", sest.TransitionRegionType,
sest.Station, sest.StationType);
// try to get the slope:
foreach (int i in Enum.GetValues(typeof(SuperelevationCrossSegmentType)))
{
try
{
// if this succeeds, we know the segment type:
double slope = sest.GetSlope((SuperelevationCrossSegmentType)i, false);
ed.WriteMessage(" Slope: {0} Segment type: {1}\n",slope,Enum.GetName(typeof(SuperelevationCrossSegmentType),i));
}
// silently fail:
catch (InvalidOperationException e) { }
}
}
}
}
}
public void GetSECurves()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// get first alignment:
ObjectId alignID = doc.GetAlignmentIds()[0];
Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForRead) as Alignment;
if (myAlignment.SuperelevationCurves.Count < 1)
{
ed.WriteMessage("You must calculate superelevation data.\n");
return;
}
foreach (SuperelevationCurve sec in myAlignment.SuperelevationCurves)
{
ed.WriteMessage("Name: {0}\n", sec.Name);
ed.WriteMessage(" Start: {0} End: {1}\n", sec.StartStation, sec.EndStation);
foreach (SuperelevationCriticalStation sest in sec.CriticalStations)
{
ed.WriteMessage(" Critical station: {0} {1} {2}\n", sest.TransitionRegionType,
sest.Station, sest.StationType);
// try to get the slope:
foreach (int i in Enum.GetValues(typeof(SuperelevationCrossSegmentType)))
{
try
{
// if this succeeds, we know the segment type:
double slope = sest.GetSlope((SuperelevationCrossSegmentType)i, false);
ed.WriteMessage(" Slope: {0} Segment type: {1}\n",slope,Enum.GetName(typeof(SuperelevationCrossSegmentType),i));
}
// silently fail:
catch (InvalidOperationException e) { }
}
}
}
}
}
사용자 편경사 곡선 생성하기
SuperelevationCurveCollection::AddUserDefinedCurve 매서드를 사용해서 사용자 정의 편경사 곡선을 생성 할 수 있다. 곡선을 정의 하려면, 곡선의 시작과 끝에 시작과 끝에 선형 sub-entities를 지정한다. 사용자 정의 곡선은 선형 line을 포함할 수 있다. 당신이 지정한 sub-entity와 sub-entity 사이에는 기존 편경사 곡선이 없도록 해야 한다.
다음 간단한 코드는 사용자 정의 편경사 곡선을 생성한다. 이것은 선형 line과 선형 나선과 그들 사이에 있는 entity로 구성된다.
[CommandMethod("AddUserDefinedCurve")]
public void AddUserDefinedCurve ()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// get first alignment:
ObjectId alignID = doc.GetAlignmentIds()[0];
Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForWrite) as Alignment;
SuperelevationCurveCollection superelevationCurves = myAlignment.SuperelevationCurves;
AlignmentEntityCollection alignmentEntities = myAlignment.Entities;
AlignmentLine startEntity = alignmentEntities.EntityAtStation(100.00) as AlignmentLine;
// get the alignment line as the start of user defined curve
AlignmentSubEntityLine startSubEntity = startEntity[0] as AlignmentSubEntityLine;
AlignmentSCS endEntity = alignmentEntities.EntityAtStation(670.00) as AlignmentSCS;
// get the first sub-entity spiral as the end of user defined curve
AlignmentSubEntitySpiral endSubEntity = endEntity[0] as AlignmentSubEntitySpiral;
SuperelevationCurve superelevationCurve = superelevationCurves.AddUserDefinedCurve(startSubEntity, endSubEntity);
ed.WriteMessage("Name: {0}\n", superelevationCurve.Name);
ed.WriteMessage(" Start: {0} End: {1}\n", superelevationCurve.StartStation, superelevationCurve.EndStation);
}
}
public void AddUserDefinedCurve ()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// get first alignment:
ObjectId alignID = doc.GetAlignmentIds()[0];
Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForWrite) as Alignment;
SuperelevationCurveCollection superelevationCurves = myAlignment.SuperelevationCurves;
AlignmentEntityCollection alignmentEntities = myAlignment.Entities;
AlignmentLine startEntity = alignmentEntities.EntityAtStation(100.00) as AlignmentLine;
// get the alignment line as the start of user defined curve
AlignmentSubEntityLine startSubEntity = startEntity[0] as AlignmentSubEntityLine;
AlignmentSCS endEntity = alignmentEntities.EntityAtStation(670.00) as AlignmentSCS;
// get the first sub-entity spiral as the end of user defined curve
AlignmentSubEntitySpiral endSubEntity = endEntity[0] as AlignmentSubEntitySpiral;
SuperelevationCurve superelevationCurve = superelevationCurves.AddUserDefinedCurve(startSubEntity, endSubEntity);
ed.WriteMessage("Name: {0}\n", superelevationCurve.Name);
ed.WriteMessage(" Start: {0} End: {1}\n", superelevationCurve.StartStation, superelevationCurve.EndStation);
}
}
선형 스타일
이 절의 주제
- 선형 스타일 생성
- 선형 레이블 스타일
선형 스타일 생성
스타일은 선형이 그려지는 방식의 여러 측면을 관리한다. 이는 화살표의 방향과 선형에 있는 곡선, 스파이럴, 라인을 포함한다. 모든 선형 스타일은 CivilDocument.Styles.AlignmentStylescollection에 포함된다. 선형 스타일은 선형 object에 의해 사용되기 전에 이 collection에 추가되어야 한다. 스타일은 보통 처음 생성될때 선형에 할당된다, 하지만 Alignment.StyleId 속성을 통해서 기존 선형에 할당 될수도 있다.
[CommandMethod("SetAlignStyle")]
public void SetAlignStyle()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Ask the user to select an alignment
PromptEntityOptions opt = new PromptEntityOptions("\nSelect an Alignment");
opt.SetRejectMessage("\nObject must be an alignment.\n");
opt.AddAllowedClass(typeof(Alignment), false);
ObjectId alignID = ed.GetEntity(opt).ObjectId;
Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForWrite) as Alignment;
ObjectId styleID = doc.Styles.AlignmentStyles.Add("Sample alignment style");
AlignmentStyle myAlignmentStyle = ts.GetObject(styleID, OpenMode.ForWrite) as AlignmentStyle;
// don't show direction arrows
myAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Arrow).Visible = false;
myAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Arrow).Visible = false;
// show curves in violet
myAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Curve).Color = Color.FromColorIndex(ColorMethod.ByAci, 200);
myAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Curve).Color = Color.FromColorIndex(ColorMethod.ByAci, 200);
// show straight sections in blue
myAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Line).Color = Color.FromColorIndex(ColorMethod.ByAci, 160);
myAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Line).Color = Color.FromColorIndex(ColorMethod.ByAci, 160);
// assign style to an existing alignment
myAlignment.StyleId = myAlignmentStyle.Id;
ts.Commit();
}
}
public void SetAlignStyle()
{
doc = CivilApplication.ActiveDocument;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Ask the user to select an alignment
PromptEntityOptions opt = new PromptEntityOptions("\nSelect an Alignment");
opt.SetRejectMessage("\nObject must be an alignment.\n");
opt.AddAllowedClass(typeof(Alignment), false);
ObjectId alignID = ed.GetEntity(opt).ObjectId;
Alignment myAlignment = ts.GetObject(alignID, OpenMode.ForWrite) as Alignment;
ObjectId styleID = doc.Styles.AlignmentStyles.Add("Sample alignment style");
AlignmentStyle myAlignmentStyle = ts.GetObject(styleID, OpenMode.ForWrite) as AlignmentStyle;
// don't show direction arrows
myAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Arrow).Visible = false;
myAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Arrow).Visible = false;
// show curves in violet
myAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Curve).Color = Color.FromColorIndex(ColorMethod.ByAci, 200);
myAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Curve).Color = Color.FromColorIndex(ColorMethod.ByAci, 200);
// show straight sections in blue
myAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Line).Color = Color.FromColorIndex(ColorMethod.ByAci, 160);
myAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Line).Color = Color.FromColorIndex(ColorMethod.ByAci, 160);
// assign style to an existing alignment
myAlignment.StyleId = myAlignmentStyle.Id;
ts.Commit();
}
}
선형 레이블 스타일
텍스트 레이블의 스타일과 그래픽 마커는 Alignment::Create() 매서드중 하나로 선형이 처음 만들어질때 LabelSet 지정(이름 또는 ObjectID에 의해)에 따라 표시된다. 또는 CivilDocument.Style.LabelSetStyles.AlignmentLabelSetStyles 속성에 label set object 할당하는 것에 따라 표시된다. AlignmentLabelSetStyles collection은 주 측점, 부 측점, 그리고 선형 geometry, 설계속도 또는 선형 방정식 변화에 배치되기 위해 별도의 스타일 셋으로 구성한다.
선형 레이블은 AlignmentLabelSetStyle collection에서 설명된다. 이것은 AlignmentLabelSetItem object의 collection이다. 주 측점에서 레이블은 LabelStyleType.AlignmentMajorStation의 LabelStyleType 속성과 함께 AlignmentLabelSetItem object에 의해서 설명된다. 부 측점 레이블은 LabelStyleType.AlignmentminorStation의 LabelStyleType 속성과 함께 AlignmentLabelSetItem에 의해 설명된다. 각 AlignmentLabelSetItem object는 관련 LabelStyle object(LabelStyle object는 LabelStyleId와 LabelStyleName 속성으로 get 또는 set을 할수 있다.) 와 레이블의 제한사항을 설명하고 있는 속성의 수와 간격을 가지고 있다. 간격은 선형을 따르는 레이블간의 간격을 의미한다. 새 AlignmentLabelSetItem이 부 측점 레이블용으로 만들어 질때(BaseLabelSetStayle.Add()를 사용한다), 그것은 주 측점 레이블 AlignmentLabelSetItemobject를 부모로 참조해야한다.
레이블은 각 선형의 끝점에 위치될수도 있다. 레이블 처럼 AlignmentLabelSetItem.GetLabeledAlignmentGeometryPoints()와 AlignmentLabelSetItem.GetLabeledAlignmentGeometryPoints() 매서드를 통해서 제어된다. 이 매서드는 선형 설계속도와 측점 방정식의 각 변화지점의 레이블에 접근할수도 있다. Get 매서드는 Dictonary 해쉬 object를 리턴한다 : Dictonary<AlignmentPointType, bool>, geometry좌표의 위치 지정, 그리고 point라 레이블되었는지를 가리키는 bool.
선형 측점의 모든 레이블 스타일을 위한 레이블 텍스트는 LabelStyle object의 텍스트 component에 의해서 제어된다. 이 component는 LabelStyle.Setcomponent() 매서드에 의해서 set된다. 다음 속성 필드의 목록은 텍스트 component를 위한 유효한 값을 설명한다.
Valid property fields for LabelStyleComponentType.Text Contents
|
<[Station Value(Uft|FS|P0|RN|AP|Sn|TP|B2|EN|W0|OF)]>
|
<[Raw Station(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
|
<[Northing(Uft|P4|RN|AP|Sn|OF)]>
|
<[Easting(Uft|P4|RN|AP|Sn|OF)]>
|
<[Design Speed(P3|RN|AP|Sn|OF)]>
|
<[Instantaneous Direction(Udeg|FDMSdSp|MB|P4|RN|DSn|CU|AP|OF)]>
|
<[Perpendicular Direction(Udeg|FDMSdSp|MB|P4|RN|DSn|CU|AP|OF)]>
|
<[Alignment Name(CP)]>
|
<[Alignment Description(CP)]>
|
<[Alignment Length(Uft|P3|RN|AP|Sn|OF)]>
|
<[Alignment Start Station(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
|
<[Alignment End Station(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
|
부 측점, geometry point, 설계속도와 측점 방정식을 위한 레이블 스타일은 다음 속성필드를 사용할 수도 있다.
<[Offset From Major Station(Uft|P3|RN|AP|Sn|OF)]>
|
Minor stations
|
<[Geometry Point Text(CP)]>
|
Geometry points
|
<[Geometry Point Entity Before Data(CP)]>
|
Geometry points
|
<[Geometry Point Entity After Data(CP)]>
|
Geometry points
|
<[Design Speed Before(P3|RN|AP|Sn|OF)]>
|
Design speeds
|
<[Station Ahead(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
|
Station equations
|
<[Station Back(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
|
Station equations
|
<[Increase/Decrease(CP)]>
|
Station equations
|
레이블 스타일은 2장의 Label Style 절에서 자세하게 설명된다.
샘플 프로그램
AlignmentSample
<installation-directory>\Sample\Civil 3D API\DotNet\VB.NET\AlignmentSample
이정에서의 샘플 코드의 일부는 AlignmentSample 프로젝트의 내용에서 찾을 수 있다. 이 샘플은 선형 생성방법을 보여주고, 선형에 entities를 추가하고, 선형 레이블 스타일 셋을 생성하고 site를 get하고, 선형 스타일을 생성하는 방법을 보여준다.
Sprial2 Demo
<installation-directory>\Sample\Civil 3D API\DotNet\CSharp\Spiral2 Demo
simple과 복합 선형 정보를 get하는 방법을 보여준다.
댓글 없음:
댓글 쓰기