API 개발자 가이드
이 절의 주제
About the Developer's Guide
이 절의 주제
대상 독자
The AutoCAD Civil 3D API 개발자 가이드는 개발자를 위해 설계되었다. AutoCAD® Civil 3D®를 사용자화 하거나 내부 APIs 사용하는 application들을 만들기를 원하는 개발자를 위해 설계 되었다. 매크로를 생성하는데에 사용되기도 한다. 이 매크로는 반복적인 작업을 자동화 하고 AutoCAD Civil 3D 사용자들과 사용자 subassemblies 을 위해 사용된다.
AutoCAD Civil 3D APIs
AutoCAD Civil 3D를 커스터 마이징 하기 위한 세가지 사용가능한 API들이 있다. :
-
.NET API — AutoCAD Civil3D에 확장기능을 만들 수 있도록 한다. 모든 .NET 언어로 만들 수 있다. 일반적으로, AutoCAD Civil3D.NET API는 COM API보다 훨씬 빠르게 실행된다. 개발은 Microsoft Visual Studio 2008 SP1 또는 그보다 이후 버전을 필요로 한다.
-
COM API — COM API에 접근하는 클라이언트를 만들수 있다 managed(.NET) 또는 unmanaged(C++) code를 통해서 접근할 수 있다. 클라이언트 Application생성하기를 봐라. 추가로, 이 API는 Visual Basic for Application(VBA) IDE에서 사용될 수 있다, 별도로 다운로드할 수 있는. VBA 지원은 종료되었다.
-
Custom Draw API (in C++) — AutoCAD ObjectARX API의 Extension은 당신이 AutoCAD Civil3D 가 object들을 랜더하는 방법을 변경하는 것을 할수 있게 한다.
The COM and .NET APIs 는 이 가이드에서 설명된다. Custom Draw API에 대한 더 많은 정보를 위해서는, Custom Draw API Reference 를 보라.(civildraw-reference.chm).
Which API you choose to use depends on what you want to do:
원하는 것:
사용하라:
AutoCAD Civil 3D에서 object가 랜더링 되는 방법을 커스터마이즈 하기
the Custom Draw API. The Custom Draw API는 AutoCAD ObjectARX API의 extension이다. 예를 들어, 당신이 TIN Surface에있는 삼각형 개수를 세기를 원한다면, 당신은 DLL을 만들 수 있다. Custom Draw API를 사용해서 만든다. AutoCAD Civil 3D 로 만들어진 샘플을 보라.
반복 액션을 자동화하는 매크로를 생성하기
.NET or COM API.
AutoCAD Civil 3D object를 조정하는 application을 만들기
.NET or COM API.
Note
기능하다면, COM API 대신 Civil .NET API를 사용해야 한다. 특히 더 긴 운영을 위해서는, .NET API 는 Civil object와 근접한 레이어이고 더 좋은 성능을 가지고 있기 때문이다. 하지만, COM object를 사용할 필요가 있음을 발견할수도 있다. 아직 .NET API에 의해 노츨되지 않은 몇몇 기능또는 object 맴버에 접근하기 위해 사용한다. 이 경우에는 둘다 사용이 가능하다. 제약과 Interop사용하기를 보라.
.NET API — AutoCAD Civil3D에 확장기능을 만들 수 있도록 한다. 모든 .NET 언어로 만들 수 있다. 일반적으로, AutoCAD Civil3D.NET API는 COM API보다 훨씬 빠르게 실행된다. 개발은 Microsoft Visual Studio 2008 SP1 또는 그보다 이후 버전을 필요로 한다.
COM API — COM API에 접근하는 클라이언트를 만들수 있다 managed(.NET) 또는 unmanaged(C++) code를 통해서 접근할 수 있다. 클라이언트 Application생성하기를 봐라. 추가로, 이 API는 Visual Basic for Application(VBA) IDE에서 사용될 수 있다, 별도로 다운로드할 수 있는. VBA 지원은 종료되었다.
Custom Draw API (in C++) — AutoCAD ObjectARX API의 Extension은 당신이 AutoCAD Civil3D 가 object들을 랜더하는 방법을 변경하는 것을 할수 있게 한다.
원하는 것:
|
사용하라:
|
AutoCAD Civil 3D에서 object가 랜더링 되는 방법을 커스터마이즈 하기
|
the Custom Draw API. The Custom Draw API는 AutoCAD ObjectARX API의 extension이다. 예를 들어, 당신이 TIN Surface에있는 삼각형 개수를 세기를 원한다면, 당신은 DLL을 만들 수 있다. Custom Draw API를 사용해서 만든다. AutoCAD Civil 3D 로 만들어진 샘플을 보라.
|
반복 액션을 자동화하는 매크로를 생성하기
|
.NET or COM API.
|
AutoCAD Civil 3D object를 조정하는 application을 만들기
|
.NET or COM API.
|
구성
이 가이드는 AutoCAD Civil3D의 주요기능들로 구성되었다. 다음 장들로 이루어져있다. 각 장들은 한개 또는 그 이상의 데모프로그램에서 사용된 API들을 포함한다.:
1장: 시작하기
COM 과 .NET 프로젝트를 설정하는 방법을 설명한다. 그리고 COM을 .NET코드로 이식하는 것을 설명한다. .NET API의 제약, 그리고 COM object에 접근하는 interop을 사용하는 방법도 설명한다.
2장: 루트 오브젝트와 공통적인 컨셉들
2장은 어떻게 기본 .NET object들을 포함하는지 설명한다. 이 object들은 문서와 데이타베이스를 표현한다. 이후 모든 장에서 필요하다. 또한 많은 기능들을 위한 공통적인 object이다(예를들면 ambient setting과 label style같은것들)
3장: 표면
설명한다 - 파일에서 표면을 import하는 방법을, point data를 직접 조정하기, brealine을 삽입하기, border를 관리하기, 등고선을 조정하기 그리고 elevation과 유역정보를 분석하기.
4장: 선형
설명한다 - 선형을 만드는 방법을 - layout 기능들을 통해서, polyline entities들로, 또는 기존 선형을에서의 offset을 기반으로, .NET API사용해서. station, design speed 그리고 superelevation에 대한 논의도 포함한다.
5장: 종단
.NET API를 사용한 종단과 종단 style의 생성을 설명한다.
6장: 단면
.NET API를 사용한 단면, 단면뷰 그리고 sample line의 생성을 설명한다.
7장: 관망
.NET API를 사용한 관, 구조물 그리고 관망의 생성 설명한다.
8장: 코리더
.NET API를 사용하여 도큐먼트에 존재하고 있는 코리더, baseline, feature line, assembly그리고 subassembly에 대한 정보를 모으고 고치는 방법을 설명한다.
9장: 점
설명한다 - 접근하고 생성하는 방법을 - 도큐먼트의 point collection에서, 점 그릅을 만들고 쿼리를 사용해서 그것들을 발행하는 방법을, 그리고 point description key 를 사용해서 point를 스타일링 하는 방법을.
10장: 커스텀 subassemblies를 생성하기
설명한다 - 생성하고 커스텀 subassembly를 설치하는 방법을 - Visual Basic .NET을 사용해서, 그리고 catalog file의 생성을 - 사용자가 커스텀 subassembly에 접근할 수 있도록 하는. 당신은 또한 subassembly를 변환 할 수 있다 - VBA에서 만들어진 - .NET으로 (더 많은 정보를 위해 부록 VBA subassembly를 .NET으로 변환하기를 보라).
부록 A: VBA subassembly를 .NET으로 변환하기
설명한다 - VBA에서 만들어진 래거시 커스텀 subassembly을 .NET으로 변환하는 방법을.
Appendix B: COM API
Covers the Legacy COM API.
.NET API의 새 기능들
이 절은 2014 릴리즈의 AutoCAD Civil3D .NET API의 변경사항을 다룬다
Corridors
Assemblies 및 관련 기능들은 이 추가사항들로 완전히 지원된다.:
-
Database에서 Assembly를 추가하고 import하는 매서드는 AssemblyCollection 클래스에 노출되어 있다..
-
assembly의 속성을(CodeSetStyleId, StyleName, StyleId, Type, Location) 접근/변경 할 수 있다..
-
Subassembly를 다루는 새 매서드는 Assembly class에 추가되었다. : AddSubassembly(), ReplaceSubassembly(), InsertSubassembly(), CopySubassembly() and MirrorSubassembly().
-
당신은 접근할 수 있다 - AssemblyGroupcollection에 - 반복 또는 제거하기 위해 AsemblyGroup과 class AssemblyGroup에 - assembly group에 있는 모든 subassembli를 얻기 위해.
-
Offset Assemblies 는 Offsetassembly collection과 함께 노출되어 있다.
Applied Assemblies:
-
당신은 계산된 points, links 그리고 shapes collection에 접근할 수 있다 - code string value에 의해서.
-
지정된 CalculatedLine의 가운데에 point를 추가하는 CalculatedPointCollection.Add() 매서드 와 Index 또는 CalculatedPoint오브젝트에 의해 지정된 point를 제거하는 Remove() 매서드는 노츨되어 있다.
-
2개의 지정된 CalculatedPoints로 링크를 추가하는 CalculatedLinkCollection.Add() 매서드와 index 또는 CalculatedLineObject에 의해서 지정된 링크를 제거하는 Remove() 매서드가 공개한다.
-
AppliedSubassembly 는 AppliedSubassembly가 parameter(Contains())를 포함하는지 체크하고 name(GetParameter(T))으로 parameter를 가져오는 새 매서드들을 공개한다.
Offset Assemblies:
-
OffsetAssemblyCollection 은 Add()와 Remove() 매서드를 공개한다..
-
The OffsetAssembly 클래스는 현재 subassembly를 add, replace, insert, copy 그리고 mirror 하는 매서드를 공개한다..
-
The OffsetAssembly 클래스는 새 Assembly 속성을 노출하여 main Assembly의 Object Id와 새 속성 Offset을 가져올 수 있도록 한다.
Subassembly:
-
ATC file에서 Stock Subassembly(ImportStockSubassembly()) 또는 Subassembly(ImportSubassembly()) 를 Import할 수 있다.
-
Subassembly를 add / remove를 하는 매서드가 노출된다.
-
Subassembly 파라미터에 접근하고 수정하는 매서드가 노출된다.
-
Subassembly 클래스는 OffsetAssembly를 가져오는 매서드를 노출하고, 속성은 Origin, OffsetToBaseline, and OffsetToAssembly를 노출한다.
Baselines:
-
BaselineCollection 클래스를 사용해서 Baselines에 access/add/remove를 할수 있고 Baseline 속성을 수정할 수 있다.
-
BaselineRegion 속성인 IsProcessed 는 더이상 사용되지 않는다, 대신 NeedsProcessing (get/set) 속성을 사용해라;
-
HardCodeOffsetBaseline 클래스는 더이상 사용되지 않는다..
-
SetAlignmentAndProfile() 매서드는 AlignmentId와 Baseline이나 OffsetBaseline의 ProfileId를 수정할수 있게 한다.
Baseline Regions:
-
BaselineRegion을 추가, 접근 또는 제거하는 매서는 BaselineRegionCollection 클래스에서 노출된다.
-
AppliedAssemblySetting 클래스는 baseline region의 assembly frequency의 설정을 노출한다.
-
BaselineRegion 클래스는 이제 다음과 같은 기능을 제공한다 : baseline의 parameter를 매치하기; Assembly ObjectId를 BaselineRegion에 설정하기; OverriedStations을 가져오거나 제거하기; 지정된 station으로 BaselineRegion을 분리하기; 그리고 처음과 마지막 영역에의해 지정된 범위에서 region을 현재 BaselineRegion에 merge하기
Corridors:
-
Corridor Object 생성이 이제 노출된다.
-
TheRegionLockMode 속성과 링크 point와 shape code strings을 가져오는 매서드가 노출되었다.
-
CorridorSection: 은 현재 CorridorSection의 subassembly에서 모든 코드를 가져오는 매서드를 노출한다.
-
Corridor Slope Pattern: corridor slope pattern을 접근/편집/추가/삭제를 할수 있다.
-
코드 이름으로 기능성 선 또는 링크를 corridor surface에 추가하고 삭제할 수 있다 그리고 기능성 선이나 링크를 브레이크라인으로 설정하는 매서드를 노출한다.
-
TinSurface 클래스는 Corridor surface에서 surface를 생성하는 매서드를 노출하고 “create from corridor” operation type을 추가한다.
Corridor Surfaces:
-
corridor surface를 추가/제거 기능이 CorridorSurfaceCollection에서 노출된다.
-
SurfaceId 속성은 CorridorSurface class에서 노출된다.
-
CorridorSurfaceBoundaryCollection: corridor 범위를 outer boundary로 추가하고 삭제 할수 있다; 빈 outside boundary를 추가할 수 있다; 주어진 기능성 라인 코드, polyline또는 polygon point로 outside boundary를 추가할 수 있다.
-
CorridorSurfaceMaskCollection: 빈 mask를 추가하고 삭제할수 있다; 주어진 기능성 라인 코드, polyline 또는 polygon point로 mask를 추가할 수 있다.
FeatureLineCodeInfoCollection, FeatureLineCodeInfo: 이 클래스들은 이제 연결된 FeatureLineCodeInfo의 배열을 가져오는 매서드를 노출한다; 그리고 기능성 라인 CodeInfo 속성을 추가하는 매서드를 노출한다 : IsConnect와 PayItem
FeatureLineComponentCollection and FeatureLineComponent classes:
-
FeatureLineComponentCollection 는 이제 Add(), Remove(), Swap() and SwapAt() 매서드를 노출한다.
-
FeatureLineComponent는 이제 새 BaselineAlignmentId 속성을 노출하고,IsReversed, StartStation and EndStation을 설정할 수 있다.
SampleLine class:
-
지정된 station에 또는 지정된 vertex point로 새 sample line을 생성하는 새로운 Create() 매서드이다.
-
새로운 LockToStation 그리고 Number properties이다.
SampleLineGroup class:
-
sample line group을 생성할 수 있고 지정된 station에 있는 sample line을 가져올 수 있다.
-
모든 section source와 material section source에 접근할 수 있고(SectionSource와 MaterialSectionSource) sampled Source를 설정할 수 있다.
-
section view groups과 sample line group에 있는 각각의 SectionViewGroup object에 접근하고 수정하는 기능을 노출한다.
-
MaterialList의 gaps에 접근하고 수정하는 기능을 노출한다.
Section View Groups::
-
SectionViewGroupCollection provides access to SectionViewGroups, create multiple section views with the Add() method, and remove with Remove() and RemoveAt() methods.
-
SectionViewGroup exposes the GetSectionViewIds() method.
SectionView :
-
지정된 sample line에서 새 section view를 생성하는 매서드를 노출한다.: Create().
-
Section view에 있는 Profile Grade Line에 접근하고 수정할 수 있다; Section View의 Volumn Table에 접근하고 수정할 수 있다.; Index나 ObjectId로 group에 있는 volumn table 위치를 바꿀 수 있다.
-
GraphOverrides 속성으로 section view에 속해 있는 section 재지정 data의 collection을 가져올 수 있다.
Sections:
-
Section과 MaterialSection 클래스를 위한 많은 새로운 속성들이 노출된다.
-
Section과 MaterialSection 클래스 둘다, ParentId 속성이 의미가 없다. 대신 새로운 SampleLineId 속성을 사용해라.
-
MaterialSectionSource 클래스는 Material Source, source type 그리고 section source가 샘플링 여부를 가져오는 속성을 노출한다.
-
SampleLine.GetMaterialSectionId()는 material 목록과 material GUID를 노출한다.
-
새로운 클래스는 QuantityTakeoffCriteria에서 import한 material 목록을 노출하고 material 목록을 지원한다.: QTOMaterialListCollection, QTOMaterialList, QTOMaterial, QTOMaterialSubcriteriaCollection, QTOMaterialSubcriteria, QTOMaterialItem, and QuantityTakeoffResult.
-
Graph: graphy의 위치를 가져오거나 설정할 수 있다.
Database에서 Assembly를 추가하고 import하는 매서드는 AssemblyCollection 클래스에 노출되어 있다..
assembly의 속성을(CodeSetStyleId, StyleName, StyleId, Type, Location) 접근/변경 할 수 있다..
Subassembly를 다루는 새 매서드는 Assembly class에 추가되었다. : AddSubassembly(), ReplaceSubassembly(), InsertSubassembly(), CopySubassembly() and MirrorSubassembly().
당신은 접근할 수 있다 - AssemblyGroupcollection에 - 반복 또는 제거하기 위해 AsemblyGroup과 class AssemblyGroup에 - assembly group에 있는 모든 subassembli를 얻기 위해.
Offset Assemblies 는 Offsetassembly collection과 함께 노출되어 있다.
당신은 계산된 points, links 그리고 shapes collection에 접근할 수 있다 - code string value에 의해서.
지정된 CalculatedLine의 가운데에 point를 추가하는 CalculatedPointCollection.Add() 매서드 와 Index 또는 CalculatedPoint오브젝트에 의해 지정된 point를 제거하는 Remove() 매서드는 노츨되어 있다.
2개의 지정된 CalculatedPoints로 링크를 추가하는 CalculatedLinkCollection.Add() 매서드와 index 또는 CalculatedLineObject에 의해서 지정된 링크를 제거하는 Remove() 매서드가 공개한다.
AppliedSubassembly 는 AppliedSubassembly가 parameter(Contains())를 포함하는지 체크하고 name(GetParameter(T))으로 parameter를 가져오는 새 매서드들을 공개한다.
OffsetAssemblyCollection 은 Add()와 Remove() 매서드를 공개한다..
The OffsetAssembly 클래스는 현재 subassembly를 add, replace, insert, copy 그리고 mirror 하는 매서드를 공개한다..
The OffsetAssembly 클래스는 새 Assembly 속성을 노출하여 main Assembly의 Object Id와 새 속성 Offset을 가져올 수 있도록 한다.
ATC file에서 Stock Subassembly(ImportStockSubassembly()) 또는 Subassembly(ImportSubassembly()) 를 Import할 수 있다.
Subassembly를 add / remove를 하는 매서드가 노출된다.
Subassembly 파라미터에 접근하고 수정하는 매서드가 노출된다.
Subassembly 클래스는 OffsetAssembly를 가져오는 매서드를 노출하고, 속성은 Origin, OffsetToBaseline, and OffsetToAssembly를 노출한다.
BaselineCollection 클래스를 사용해서 Baselines에 access/add/remove를 할수 있고 Baseline 속성을 수정할 수 있다.
BaselineRegion 속성인 IsProcessed 는 더이상 사용되지 않는다, 대신 NeedsProcessing (get/set) 속성을 사용해라;
HardCodeOffsetBaseline 클래스는 더이상 사용되지 않는다..
SetAlignmentAndProfile() 매서드는 AlignmentId와 Baseline이나 OffsetBaseline의 ProfileId를 수정할수 있게 한다.
BaselineRegion을 추가, 접근 또는 제거하는 매서는 BaselineRegionCollection 클래스에서 노출된다.
AppliedAssemblySetting 클래스는 baseline region의 assembly frequency의 설정을 노출한다.
BaselineRegion 클래스는 이제 다음과 같은 기능을 제공한다 : baseline의 parameter를 매치하기; Assembly ObjectId를 BaselineRegion에 설정하기; OverriedStations을 가져오거나 제거하기; 지정된 station으로 BaselineRegion을 분리하기; 그리고 처음과 마지막 영역에의해 지정된 범위에서 region을 현재 BaselineRegion에 merge하기
Corridor Object 생성이 이제 노출된다.
TheRegionLockMode 속성과 링크 point와 shape code strings을 가져오는 매서드가 노출되었다.
CorridorSection: 은 현재 CorridorSection의 subassembly에서 모든 코드를 가져오는 매서드를 노출한다.
Corridor Slope Pattern: corridor slope pattern을 접근/편집/추가/삭제를 할수 있다.
코드 이름으로 기능성 선 또는 링크를 corridor surface에 추가하고 삭제할 수 있다 그리고 기능성 선이나 링크를 브레이크라인으로 설정하는 매서드를 노출한다.
TinSurface 클래스는 Corridor surface에서 surface를 생성하는 매서드를 노출하고 “create from corridor” operation type을 추가한다.
corridor surface를 추가/제거 기능이 CorridorSurfaceCollection에서 노출된다.
SurfaceId 속성은 CorridorSurface class에서 노출된다.
CorridorSurfaceBoundaryCollection: corridor 범위를 outer boundary로 추가하고 삭제 할수 있다; 빈 outside boundary를 추가할 수 있다; 주어진 기능성 라인 코드, polyline또는 polygon point로 outside boundary를 추가할 수 있다.
CorridorSurfaceMaskCollection: 빈 mask를 추가하고 삭제할수 있다; 주어진 기능성 라인 코드, polyline 또는 polygon point로 mask를 추가할 수 있다.
FeatureLineComponentCollection 는 이제 Add(), Remove(), Swap() and SwapAt() 매서드를 노출한다.
FeatureLineComponent는 이제 새 BaselineAlignmentId 속성을 노출하고,IsReversed, StartStation and EndStation을 설정할 수 있다.
지정된 station에 또는 지정된 vertex point로 새 sample line을 생성하는 새로운 Create() 매서드이다.
새로운 LockToStation 그리고 Number properties이다.
sample line group을 생성할 수 있고 지정된 station에 있는 sample line을 가져올 수 있다.
모든 section source와 material section source에 접근할 수 있고(SectionSource와 MaterialSectionSource) sampled Source를 설정할 수 있다.
section view groups과 sample line group에 있는 각각의 SectionViewGroup object에 접근하고 수정하는 기능을 노출한다.
MaterialList의 gaps에 접근하고 수정하는 기능을 노출한다.
SectionViewGroupCollection provides access to SectionViewGroups, create multiple section views with the Add() method, and remove with Remove() and RemoveAt() methods.
SectionViewGroup exposes the GetSectionViewIds() method.
지정된 sample line에서 새 section view를 생성하는 매서드를 노출한다.: Create().
Section view에 있는 Profile Grade Line에 접근하고 수정할 수 있다; Section View의 Volumn Table에 접근하고 수정할 수 있다.; Index나 ObjectId로 group에 있는 volumn table 위치를 바꿀 수 있다.
GraphOverrides 속성으로 section view에 속해 있는 section 재지정 data의 collection을 가져올 수 있다.
Section과 MaterialSection 클래스를 위한 많은 새로운 속성들이 노출된다.
Section과 MaterialSection 클래스 둘다, ParentId 속성이 의미가 없다. 대신 새로운 SampleLineId 속성을 사용해라.
MaterialSectionSource 클래스는 Material Source, source type 그리고 section source가 샘플링 여부를 가져오는 속성을 노출한다.
SampleLine.GetMaterialSectionId()는 material 목록과 material GUID를 노출한다.
새로운 클래스는 QuantityTakeoffCriteria에서 import한 material 목록을 노출하고 material 목록을 지원한다.: QTOMaterialListCollection, QTOMaterialList, QTOMaterial, QTOMaterialSubcriteriaCollection, QTOMaterialSubcriteria, QTOMaterialItem, and QuantityTakeoffResult.
Graph: graphy의 위치를 가져오거나 설정할 수 있다.
COM 변경사항들
COM API를 사용하고 있다면 object version을 10.3으로 update를 할 필요가 있다.(AutoCAD Civil3D 2013에서 사용된 10.0에서). 노출된 object와 interface는 동일하게 남아 있지만 당신은 기본위치 "C:\Program Files\Common Files\Autodesk Shared\Civil Engineering 103"에 설치된 새 라이브러리를 참조해야 한다.
추가적으로, interop DLLs는 더이상 등록되지 않는다 - Primary Interop Assemblies(PIAs)로 , 그리고 Global Asembly Cache(GAC) 가 아닌 AutoCAD Civil 3D 설치 디렉토리에 배포된다. 이것은 이런 assembly들이 AutoCAD Civil 3D 2013의 이전처럼 COM tab에서가 아니라 Add Reference dialog의 Browse tab을 사용하여 Visual Studio projects에 추가되어야 한다는 것을 의미한다-
AutoCAD Civil3D 2014보다 이전에 만들어진 프로젝트를 컴파일 하기 위해서는, 프로젝트에서 모든 interop assembly에 대한 참조를 제거하고 난 다음에 Browse tab을 사용해서 그것들을 다시 추가할 필요가 있을것이다.
COM interop를 위한 assembly의 요구사항들 :
-
Autodesk.AEC.Interop.Base
-
Autodesk.AEC.Interop.UiBase
-
Autodesk.AutoCAD.Interop
-
Autodesk.AutoCAD.Interop.Common
-
Autodesk.AECC.Interop.<domain>
-
Autodesk.AEC.Interop.Ui<domain>
<domain>은 4개의 Civil 3D COM domains중 1개이다: Land, Roadway, Pipe, or Survey.
우리는 각각의 interop assembly 를 위한 “Embed Interop Types” property 를 True로 설정하는 것을 권장한다, 이렇게 하면 모든 참조 타입이 당신의 대상 assembly로 포함되고, 참조된 interop DLL들이 runtime에 요구되지 않게 된다.
또한 이런 새로운 API들과 이번 릴리즈에서 제외된 아이템들에 대한 자세한 정보를 위해서는 AutoCAD Civil 3D .NET API Reference를 보라.
Autodesk.AEC.Interop.Base
Autodesk.AEC.Interop.UiBase
Autodesk.AutoCAD.Interop
Autodesk.AutoCAD.Interop.Common
Autodesk.AECC.Interop.<domain>
Autodesk.AEC.Interop.Ui<domain>
법적 고지
Autodesk AutoCAD Civil 3D 2014
© 2013 Autodesk, Inc. All Rights Reserved. Except as otherwise permitted by Autodesk, Inc., this publication, or parts thereof, may not be reproduced in any form, by any method, for any purpose.
Certain materials included in this publication are reprinted with the permission of the copyright holder.
Trademarks
The following are registered trademarks or trademarks of Autodesk, Inc., and/or its subsidiaries and/or affiliates in the USA and other countries: 123D, 3ds Max, Algor, Alias, AliasStudio, ATC, AutoCAD, AutoCAD Learning Assistance, AutoCAD LT, AutoCAD Simulator, AutoCAD SQL Extension, AutoCAD SQL Interface, Autodesk, Autodesk 123D, Autodesk Homestyler, Autodesk Intent, Autodesk Inventor, Autodesk MapGuide, Autodesk Streamline, AutoLISP, AutoSketch, AutoSnap, AutoTrack, Backburner, Backdraft, Beast, Beast (design/logo), BIM 360, Built with ObjectARX (design/logo), Burn, Buzzsaw, CADmep, CAiCE, CAMduct, CFdesign, Civil 3D, Cleaner, Cleaner Central, ClearScale, Colour Warper, Combustion, Communication Specification, Constructware, Content Explorer, Creative Bridge, Dancing Baby (image), DesignCenter, Design Doctor, Designer's Toolkit, DesignKids, DesignProf, Design Server, DesignStudio, Design Web Format, Discreet, DWF, DWG, DWG (design/logo), DWG Extreme, DWG TrueConvert, DWG TrueView, DWGX, DXF, Ecotect, ESTmep, Evolver, Exposure, Extending the Design Team, FABmep, Face Robot, FBX, Fempro, Fire, Flame, Flare, Flint, FMDesktop, ForceEffect, Freewheel, GDX Driver, Glue, Green Building Studio, Heads-up Design, Heidi, Homestyler, HumanIK, i-drop, ImageModeler, iMOUT, Incinerator, Inferno, Instructables, Instructables (stylized robot design/logo), Inventor, Inventor LT, Kynapse, Kynogon, LandXplorer, Lustre, Map It, Build It, Use It, MatchMover, Maya, Mechanical Desktop, MIMI, Moldflow, Moldflow Plastics Advisers, Moldflow Plastics Insight, Moondust, MotionBuilder, Movimento, MPA, MPA (design/logo), MPI (design/logo), MPX, MPX (design/logo), Mudbox, Multi-Master Editing, Navisworks, ObjectARX, ObjectDBX, Opticore, Pipeplus, Pixlr, Pixlr-o-matic, PolarSnap, Powered with Autodesk Technology, Productstream, ProMaterials, RasterDWG, RealDWG, Real-time Roto, Recognize, Render Queue, Retimer, Reveal, Revit, Revit LT, RiverCAD, Robot, Scaleform, Scaleform GFx, Showcase, Show Me, ShowMotion, SketchBook, Smoke, Softimage, Socialcam, Sparks, SteeringWheels, Stitcher, Stone, StormNET, TinkerBox, ToolClip, Topobase, Toxik, TrustedDWG, T-Splines, U-Vis, ViewCube, Visual, Visual LISP, Vtour, WaterNetworks, Wire, Wiretap, WiretapCentral, XSI.
All other brand names, product names or trademarks belong to their respective holders.
Disclaimer
THIS PUBLICATION AND THE INFORMATION CONTAINED HEREIN IS MADE AVAILABLE BY AUTODESK, INC. "AS IS." AUTODESK, INC. DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE REGARDING THESE MATERIALS.
Getting Started
이 장은 VBA를 사용하는 방법을 설명한다, 그리고 AutoCAD Civil 3D의 COM이나 .NET API를 사용하기 위한 새 프로젝트를 설정하는 방법을 설명한다.
이 절의 주제
AutoCAD Civil 3D용 .NET 프로젝트 설정
이 절은 Visual Studio와 AutoCAD Civil 3D managed class 를 사용해서 .NET 솔루션을 설정하는 기본 단계들을 설명한다. 이 단계들은 Microsoft Visual C# .NET을 사용하든 Visual Basic .NET를 사용하든 비슷하다. 이 아래 예제는 Visual Studio 2010에서 C#을 사용한다. Visual Studio의 Express(free) version 조금 다르게 보일지도 모르지만 사용될 수 있다.
Microsoft Visual Studio 에서 AutoCAD Civil 3D managed 클래스를 사용하는 새 프로젝트 만들기.
-
Visual Studio 2010에서, 새로운 Class Library 솔루션과 프로젝트를 생성하라.
-
Visual Studio 의 New Project Dialog
-
Project menu 선택 Add References, 또는 솔루션 탐색기의 References에서 오른쪽 버튼 클릭하고 Add References를 선택.
-
AutoCAD Civil 3D 설치 디렉토리로 찾아가고, 기본 library인 acdbmgd.dll, acmgd.dll, accoremgd.dll, AecBaseMgd.dll, and AeccDbMgd.dll 를 선택한다.
-
Note
-
이것들은 기본 AutoCAD와 AutoCAD Civil3D managed library이다. 당신의 .NET assembly는 추가 library에서 정의된 클래스들을 사용할 수 있다.
-
디버깅을 할수 있게 하고 프로젝트를 위해 요구되는 디스크 공간을 줄여준다, Visual Studio 솔루션 탐색기에서 이 library들을 선택하고, Copy Local property를 False로 설정하라.
-
옵션으로, 디버깅하기 좋도록 Visual Studio에서 application을 실행할때 AutoCAD Civil 3D를 시작하도록 구성할 수 있다.
-
Note
-
이 옵션은 Express (free) versions of Visual Studio에서는 설정할 수 없다.
-
프로젝트 속성 페이지에서, 디버그 패널을 선택하라.\.
-
Start Action 아래에 있는, 시작 외부 프로그램을 선택하고, AutoCAD Civil 3D 디렉토리에 있는 acad.exe 를 실행할 수 있는 경로를 입력하라.
-
시작 옵션 아래에 있는, Command line argument에 /ld "C:\Program Files\AutoCAD Civil 3D 2014\AecBase.dbx" /p "<<C3D_Imperial>>" 를 입력하라.
-
시작 옵션 아래에 있는, 작업 디렉토리를 채워 넣어라, 예 : C:\Program Files\AutoCAD Civil 3D 2014\UserDataCache\
-
당신의 main class에 IExtensionApplication interface 를 구현하라. Autodesk.AutoCAD.Runtime namespace를 추가하라(이 interface가 정의된 위치를 의미한다), 그리고 당신의 클래스 정의 뒤에 있는 IExtensionApplication : Visual Studio는 interface를 위한 stubs를 구현하는 완전한 옵션 코드를 제공할 것이다. 당신의 코드는 이제 이렇게 보여야 한다.:
-
using System;
using Autodesk.AutoCAD.Runtime;
namespace GettingStarted
{
public class Class1 : IExtensionApplication
{
#region IExtensionApplication Members
public void Initialize()
{
throw new System.Exception("The method or operation is not implemented.");
}
public void Terminate()
{
throw new System.Exception("The method or operation is not implemented.");
}
#endregion
}
}
-
당신은 이 매서드의 기본 내용을 제거하거나 주석처리할 수 있다. Initialize()는 당신의 assembly가 AutoCAD Civil 3D에서 NETLOAD 명령에 의해 처음 로드될때 호출된다, 그리고 리소스를 설정하고, 구성파일을 읽고, 다른 초기화 작업을 하는 요도로 사용될 수 있다. Terminate()는 AutoCAD Civil 3D가 종료(.NET assembly를 unload하는 NETUNLOAD 명령는 없다)될 때 호출되고, 자원을 확보하기 위해 정리하는 용도로 사용될 수 있다.
-
당신은 CommandMethod attribute의 대상인 public 매서드를 생성할 준비가 되었다. 이 attribute는 매서드를 호출하는 AutoCAD Civil 3D command를 정의한다. 예 :
-
[CommandMethod("HelloWorld")]
public void HelloWorld()
{
}
-
“Hello World” 메세지를 command line에 출력하는 매서드를 만들자. Autodesk.AutoCAD.ApplicationServices namespace를 추가하라, 그리고 HelloWorld() 매서드에 이 줄을 추가하라:
-
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nHello World!\n");
-
당신은 이제 assembly를 빌드하고 실행할 수 있다. AutoCAD Civil 3D를 시작하고 command line에 NETLOAD를 타이핑하라. Choose .NET Assembly dialog에서 당신의 assembly DLL을 찾아라(만약 당신이 step1 에서 했던 프로젝트 설정을 사용하고 있다면, 이것은 GettingStarted.dll일 것이다.). command line에 HELLOWORLD를 타이핑하라, 그러면 당신은 command 출력을 볼 수 있을 것이다.:
-
-
이전 단계는 AutoCAD Application 클래스에 있는 기능을 사용했다. AutoCAD Civil 3D managed 클래스에 있는 몇가지 기능을 포함시켜 보자. 우선, 2개이상의 namespace를 추가하라 : Autodesk.AutoCAD.DatabaseServices and Autodesk.Civil.ApplicationServices. 그 다음 현재 라인들을 추가하여 현재 Civil document를 얻고, 그것에 대한 몇가지 기본정보를 가져오고, 그 정보를 출력하라.
-
public void HelloWorld()
{
CivilDocument doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
ObjectIdCollection alignments = doc.GetAlignmentIds();
ObjectIdCollection sites = doc.GetSiteIds();
String docInfo = String.Format("\nHello World!\nThis document has {0} alignments and {1} sites.\n", alignments.Count, sites.Count);
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(docInfo);
}
-
AutoCAD Civil 3D에 선형과 사이트를 포함하는 document를 열거나 생성하라. 당신이 이제 HELLOWORLD command를 실행하면, 당신은 이것과 비슷한 출력을 보아야 한다.
-
더 많은 샘플은 , AutoCAD Civil 3D\samples\dotNet 디렉토리에서 보라.
Visual Studio 2010에서, 새로운 Class Library 솔루션과 프로젝트를 생성하라.
- Visual Studio 의 New Project Dialog
Project menu 선택 Add References, 또는 솔루션 탐색기의 References에서 오른쪽 버튼 클릭하고 Add References를 선택.
AutoCAD Civil 3D 설치 디렉토리로 찾아가고, 기본 library인 acdbmgd.dll, acmgd.dll, accoremgd.dll, AecBaseMgd.dll, and AeccDbMgd.dll 를 선택한다.
- Note
- 이것들은 기본 AutoCAD와 AutoCAD Civil3D managed library이다. 당신의 .NET assembly는 추가 library에서 정의된 클래스들을 사용할 수 있다.
- 디버깅을 할수 있게 하고 프로젝트를 위해 요구되는 디스크 공간을 줄여준다, Visual Studio 솔루션 탐색기에서 이 library들을 선택하고, Copy Local property를 False로 설정하라.
옵션으로, 디버깅하기 좋도록 Visual Studio에서 application을 실행할때 AutoCAD Civil 3D를 시작하도록 구성할 수 있다.
- Note
- 이 옵션은 Express (free) versions of Visual Studio에서는 설정할 수 없다.
- 프로젝트 속성 페이지에서, 디버그 패널을 선택하라.\.
- Start Action 아래에 있는, 시작 외부 프로그램을 선택하고, AutoCAD Civil 3D 디렉토리에 있는 acad.exe 를 실행할 수 있는 경로를 입력하라.
- 시작 옵션 아래에 있는, Command line argument에 /ld "C:\Program Files\AutoCAD Civil 3D 2014\AecBase.dbx" /p "<<C3D_Imperial>>" 를 입력하라.
- 시작 옵션 아래에 있는, 작업 디렉토리를 채워 넣어라, 예 : C:\Program Files\AutoCAD Civil 3D 2014\UserDataCache\
당신의 main class에 IExtensionApplication interface 를 구현하라. Autodesk.AutoCAD.Runtime namespace를 추가하라(이 interface가 정의된 위치를 의미한다), 그리고 당신의 클래스 정의 뒤에 있는 IExtensionApplication : Visual Studio는 interface를 위한 stubs를 구현하는 완전한 옵션 코드를 제공할 것이다. 당신의 코드는 이제 이렇게 보여야 한다.:
- using System;
using Autodesk.AutoCAD.Runtime;
namespace GettingStarted
{
public class Class1 : IExtensionApplication
{
#region IExtensionApplication Members
public void Initialize()
{
throw new System.Exception("The method or operation is not implemented.");
}
public void Terminate()
{
throw new System.Exception("The method or operation is not implemented.");
}
#endregion
}
}
당신은 이 매서드의 기본 내용을 제거하거나 주석처리할 수 있다. Initialize()는 당신의 assembly가 AutoCAD Civil 3D에서 NETLOAD 명령에 의해 처음 로드될때 호출된다, 그리고 리소스를 설정하고, 구성파일을 읽고, 다른 초기화 작업을 하는 요도로 사용될 수 있다. Terminate()는 AutoCAD Civil 3D가 종료(.NET assembly를 unload하는 NETUNLOAD 명령는 없다)될 때 호출되고, 자원을 확보하기 위해 정리하는 용도로 사용될 수 있다.
당신은 CommandMethod attribute의 대상인 public 매서드를 생성할 준비가 되었다. 이 attribute는 매서드를 호출하는 AutoCAD Civil 3D command를 정의한다. 예 :
- [CommandMethod("HelloWorld")]
public void HelloWorld()
{
}
“Hello World” 메세지를 command line에 출력하는 매서드를 만들자. Autodesk.AutoCAD.ApplicationServices namespace를 추가하라, 그리고 HelloWorld() 매서드에 이 줄을 추가하라:
- Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nHello World!\n");
당신은 이제 assembly를 빌드하고 실행할 수 있다. AutoCAD Civil 3D를 시작하고 command line에 NETLOAD를 타이핑하라. Choose .NET Assembly dialog에서 당신의 assembly DLL을 찾아라(만약 당신이 step1 에서 했던 프로젝트 설정을 사용하고 있다면, 이것은 GettingStarted.dll일 것이다.). command line에 HELLOWORLD를 타이핑하라, 그러면 당신은 command 출력을 볼 수 있을 것이다.:
이전 단계는 AutoCAD Application 클래스에 있는 기능을 사용했다. AutoCAD Civil 3D managed 클래스에 있는 몇가지 기능을 포함시켜 보자. 우선, 2개이상의 namespace를 추가하라 : Autodesk.AutoCAD.DatabaseServices and Autodesk.Civil.ApplicationServices. 그 다음 현재 라인들을 추가하여 현재 Civil document를 얻고, 그것에 대한 몇가지 기본정보를 가져오고, 그 정보를 출력하라.
- public void HelloWorld()
{
CivilDocument doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
ObjectIdCollection alignments = doc.GetAlignmentIds();
ObjectIdCollection sites = doc.GetSiteIds();
String docInfo = String.Format("\nHello World!\nThis document has {0} alignments and {1} sites.\n", alignments.Count, sites.Count);
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(docInfo);
}
AutoCAD Civil 3D에 선형과 사이트를 포함하는 document를 열거나 생성하라. 당신이 이제 HELLOWORLD command를 실행하면, 당신은 이것과 비슷한 출력을 보아야 한다.
Toolbox에서 command를 실행하기
AutoCAD Civil 3D확장을 사용자에게 노출하도록 권장된 방법은 toolbox 매크로를 생성해서 그것을 Toolspace에 있는 Toolbox tab에 추가하는 것이다. Toolbox는 command를 포함하고 있는 .NET assembly나 ARX DLL을 로딩하는 것을 처리한다.
Toolbox 매크로가 가질 수 있는 2가지 실행 타입이 있다. :
-
CMD - command 이름은 command line 으로 보내져서 실행된다. 이것은 .NET과 ARX 명령 모두에게 권장되는 실행타입이다.
-
.NET - 매서드 이름이 Reflection을 통해서 assembly에 위치되고, 직접 실행된다. No attribute 플래그가 읽어지고 코드가 항상 application context에서 실행된다.(command line에서 실행된 command는 기본적으로 drawing context에서 실행된다). 그러므로 .NET 실행타입으로 실행되는 코드는 항상 static 매서드이어야 한다, 그리고 자신의 document 잠금을 핸들링 해야 한다.
Note
코드가 document context에서 실행되더라도, document를 명시적으로 잠그는 것은 안전하다.
여기에 document 잠금을 핸들링하는 방법에 대한 예제가 있다.:
static void setPrecision()
{
using (Autodesk.AutoCAD.ApplicationServices.DocumentLock locker = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
{
// perform any document / database modifications here
CivilApplication.ActiveDocument.Settings.DrawingSettings.AmbientSettings.Station.Precision.Value = 2;
}
}
Toolbox Editor를 사용해서 컴파일된 command에 대한 toolbox 매크로를 생성하기
-
Toolspace에서 Toolbox tab을 클릭하라.
-
Toolbox Edit open하기 위해 를 클릭하라.
-
Miscellaneous Utilities에서 오른버튼을 클릭하고 New Category를 클릭하라.
-
new category에서 오른버튼을 클릭하고 New Tool을 클릭하라.
-
new tool을 선택하고 이름을 입력하라.
-
실행타입을 위해, drop-down 을 클릭하고 CMD 나 .NET을 선택하라.
-
Note
-
CMD는 대부분의 상황에서 권장되는 실행타입이다, 왜냐하면 명시적으로 document 잠금을 핸들링할 필요가 없기 때문이다.
-
. CMD is the recommended execution type in most cases, because you do not need to explicitly handle document locking. 위 설명을 보라.
-
실행 파일을 위해, command를 포함하고 있는 .NET assembly나 ARX DLL을 찾
-
매크로 이름을 위해, 입력하라 :
-
실행타입이 CMD라면 실행을 위한 command의 이름.
-
실행타입이 .NET이라면 실행하기 위한 매서드의 이름.
-
옵션으로, command를 위한 도움말 파일과 도움말 주제를 입력하라.
-
변경사항을 적용하고 edito를 닫기 위해 를 클릭하라.
command가 설정된 후에, 오른키를 클릭하거나 실행을 클릭해서 실행할 수 있다.
CMD - command 이름은 command line 으로 보내져서 실행된다. 이것은 .NET과 ARX 명령 모두에게 권장되는 실행타입이다.
.NET - 매서드 이름이 Reflection을 통해서 assembly에 위치되고, 직접 실행된다. No attribute 플래그가 읽어지고 코드가 항상 application context에서 실행된다.(command line에서 실행된 command는 기본적으로 drawing context에서 실행된다). 그러므로 .NET 실행타입으로 실행되는 코드는 항상 static 매서드이어야 한다, 그리고 자신의 document 잠금을 핸들링 해야 한다.
{
using (Autodesk.AutoCAD.ApplicationServices.DocumentLock locker = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
{
// perform any document / database modifications here
CivilApplication.ActiveDocument.Settings.DrawingSettings.AmbientSettings.Station.Precision.Value = 2;
}
}
Toolspace에서 Toolbox tab을 클릭하라.
Toolbox Edit open하기 위해 를 클릭하라.
Miscellaneous Utilities에서 오른버튼을 클릭하고 New Category를 클릭하라.
new category에서 오른버튼을 클릭하고 New Tool을 클릭하라.
new tool을 선택하고 이름을 입력하라.
실행타입을 위해, drop-down 을 클릭하고 CMD 나 .NET을 선택하라.
Note
- CMD는 대부분의 상황에서 권장되는 실행타입이다, 왜냐하면 명시적으로 document 잠금을 핸들링할 필요가 없기 때문이다.
- . CMD is the recommended execution type in most cases, because you do not need to explicitly handle document locking. 위 설명을 보라.
실행 파일을 위해, command를 포함하고 있는 .NET assembly나 ARX DLL을 찾
매크로 이름을 위해, 입력하라 :
- 실행타입이 CMD라면 실행을 위한 command의 이름.
- 실행타입이 .NET이라면 실행하기 위한 매서드의 이름.
옵션으로, command를 위한 도움말 파일과 도움말 주제를 입력하라.
변경사항을 적용하고 edito를 닫기 위해 를 클릭하라.
COM 코드를 .NET으로 전환하기
대다수의 경우, .NET API는 COM API의 구조와 반대다, 그래서 .NET으로 코드를 포팅하는 것은 .NET 프로젝트를 설정하는것, 코드를 복사하는것, .NET 이름와 매치되는 클래스와 매서드이름을 변경하는것을 포함한다. 만약 당신이 VB.NET대신 C#을 사용한다면, 코드구조에 몇가지 추가적인 변경사항이 요구된다. 아래 절은 2가지 API에서 차이점 몇가지를 설명한다.
이 절의 주제
-
기본 Objects
-
-
스타일
-
설정
-
-
제한과 Interop 사용
기본 Objects
스타일
설정
제한과 Interop 사용
기본 Objects
COM API를 사용하려면 AcadApplication object에 접근하고(ThisDrainage.Application object를 통해서), AeccApplication object 용 interface object를 가져오고, active document가져와야 한다. .NET API에서는 Autodesk.Civil.ApplicationService namespace를 import하고 CivilApplication 클래스에서 active document를 가져온다.
g_oDocument = CivilApplication.ActiveDocument()
Land, Pipe, Roadway 그리고 Survey를 위한 4개의 domain root object를 대신하는 CivilDocument라는 single root document object가 있다.
Transactions and ObjectIds
.NET API에서, root Civil document를 읽고 쓰는 code는 transaction을 시작하고 commit하기 위한 Autodesk.AutoCAD.DataServices.TransactionManager object를 사용해야 한다. 그것이 Using 구문(블럭의 끝에서 자동으로 Transaction을 처리하는 )을 사용해서 Transaction을 관리하는 최고의 방법이다.; 그렇지 않으면 Transaction 은 Try-Finally block의 마지막 절에서 명시적으로 처리되어야 한다. 여기에 Using block안에 있는 Transaction의 예제가 있다.:
using (Transaction trans=TransactionManager.StartTransaction())
{
//operation here
trans.Commit();
}
Note
Transaction object를 사용하여 drawing database object를 open하고 수정하는 것에 대한 것에 대한 더 많은 정보를 위해서는 AutoCAD .NET 개발자 가이드에 있는 "Use Transactions With the Transaction Manager (.NET)" 절을 봐라.
.NET API에서, collections 가져온 objects들은, 거의 모든 상황에서, ObjectId type, Transaction object를 사용해서 그들의예정된 타입으로 캐스트 되어야 한다.(TransactionManager.StartTransaction()에 의해서 리턴된다). 여기 예제가 있다:
m_AligmentStyleId = m_doc.Styles.AlignmentStyles.Item(sStyleName)
oAlignmentStyle = m_trans.GetObject(m_AligmentStyleId, OpenMode.ForWrite) As AlignmentStyle
{
//operation here
trans.Commit();
}
oAlignmentStyle = m_trans.GetObject(m_AligmentStyleId, OpenMode.ForWrite) As AlignmentStyle
스타일
COM API에서, 스타일은 root document object에 의해서 유지된다. .NET API에서는, 스타일은 CivilDocument.Styles아래에 위치해있고, StyleRoot타입의 object이고 StyleBase에서 상속된 style object를 포함한다.StyleBase object용 style attributes를 가져오고, 설정하는것은 property보다는 GetDisplayStyle*() 매서드를 사용하는 것을 요구한다. 여기서 COM VBA에서의 예제가 있다.:
oAlignmentStyle.ArrowDisplayStyle2d.Visible = False
oAlignmentStyle.ArrowDisplayStyle3d.Visible = False
' violet색으로 곡선을 표시하라.
oAlignmentStyle.CurveDisplayStyle2d.color = 200 ' violet
oAlignmentStyle.CurveDisplayStyle3d.color = 200 ' violet
oAlignmentStyle.CurveDisplayStyle2d.Visible = True
oAlignmentStyle.CurveDisplayStyle3d.Visible = True
이것은 VB.NET에서의 동일한 코드이다.
oAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Arrow).Visible = False
oAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Arrow).Visible = False
' violet색으로 곡선을 표시하라.
oAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Curve).Color = Autodesk.AutoCAD.Colors.Color.FromRgb(191, 0, 255) ' violet
oAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Curve).Color = Autodesk.AutoCAD.Colors.Color.FromRgb(191, 0, 255) ' violet
oAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Curve).Visible = True
oAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Curve).Visible = True
oAlignmentStyle.ArrowDisplayStyle3d.Visible = False
' violet색으로 곡선을 표시하라.
oAlignmentStyle.CurveDisplayStyle2d.color = 200 ' violet
oAlignmentStyle.CurveDisplayStyle3d.color = 200 ' violet
oAlignmentStyle.CurveDisplayStyle2d.Visible = True
oAlignmentStyle.CurveDisplayStyle3d.Visible = True
oAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Arrow).Visible = False
' violet색으로 곡선을 표시하라.
oAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Curve).Color = Autodesk.AutoCAD.Colors.Color.FromRgb(191, 0, 255) ' violet
oAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Curve).Color = Autodesk.AutoCAD.Colors.Color.FromRgb(191, 0, 255) ' violet
oAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Curve).Visible = True
oAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Curve).Visible = True
설정
COM API에서, 설정은 AceeDataBase::Setting object를 통해서 접근되고, object 상속설정을 표시하는 properties를 포함한다. .NET API에서, 당신은 매서드를 사용하여 특정 설정 object를 검색할 수 있다. 예를 들면:
SettingsPipeNetwork oSettingsPipeNetwork = doc.Settings.GetFeatureSettings<SettingsPipeNetwork>() as SettingsPipeNetwork;
Properties
COM API에서, properties는 일반적으로 double 같은 간단한 기본제공 형식이거나, String처럼 VBA 기본 제공형식에 매핑되는 BSTR같은 형식이다. .NET API에서, 대부분의 properties는 IProperty interface를 구현하는 Property* class 중 하나이다. 이런 properties를 위해서, 당신은 property의 값을 가져오거나 설정할 수 있다. 예를 들면, COM에서의 코드는 :
oLabelStyleLineComponent.Visibility = True
.NET에서는 이런게 된다.:
oLabelStyleLineComponent.General.Visible.Value = true;
Note
여기 몇가지 다른 변경사항들이 있다: Visibility property는 Visible로 이름이 변경되었다. 이 속성은 General이라는 LabelStyleLineComponent의 sub-property로 이동되었다.
제한과 Interop 사용하기
.NET API는 AutoCAD Civil 3D의 모든 기능을 노출하지는 않고, COM API보다 적게 노출한다. 아래 영역은 .NET에서 아직 노출되지 않는다.
-
Sites and Parcels
-
Data Bands
-
Some labels
추가적으로, 구현된 기능에서 몇가지 영역은 아직 완료되지 않았다.
-
Pipes : 간섭 체크(간섭 체크 스타일은 제외)
만약 당신이 당신의 .NET 프로젝트에서 이 기능을 요구한다면, 당신은 동일한 기능의 COM object를 사용할 수 있다.
.NET에서 AutoCAD Civil3D API 사용하기
-
.NET솔루션과 프로젝트를 생성하라.
-
Project menu나 Solution Explorer에서 Add Reference를 선택하라.
-
Browse tab에서, Civil 3D 설치 디렉토리로 이동하라, 그리고 다음 COM interop DLL을 선택하라, <domain>은 당신이 사용하기를 원하는 Civil domain이다.(Land, Roadway, Pipe, or Survey)::
-
Autodesk.AEC.Interop.Base
-
Autodesk.AEC.Interop.UiBase
-
Autodesk.AutoCAD.Interop
-
Autodesk.AutoCAD.Interop.Common
-
Autodesk.AECC.Interop.<domain>
-
Autodesk.AECC.Interop.Ui<domain>
-
위에서의 참조를 선택하라, 그리고 “Copy Local” property를 true로 설정하라, 이 옵션은 모든 참조된 유형을 당신의 대상 assembly에 되함되게 하므로, 참조된 interop DLL들이 런타임에서는 요구되지 않는다.
-
Autodesk.AutoCAd.Interop와 Autodesk.AECC.Interop.Ui<domain> namespace를 using 또는 Imports 구문에 추가하라.
Note
당신은 다양한 Autodesk.AutoCAD.Interop namespace 에서는 찾을수 없는 유형에 대한 경고를 보게 될것이다. 이 경고를 비활성화 하려면, project’s properties의 Build tab의 Supress Warnings에 1684를 입력하라.
여기 COM interop를 사용하는 document에서 point groups와 surface의 개수를 가져오는 것에 대한 C# 예제가 있다 :
string m_sAcadProdID = "AutoCAD.Application";
string m_sAeccAppProgId = "AeccXUiLand.AeccApplication.10.3";
...
private void useCom()
{
//Construct AeccApplication object, Document and Database objects
m_oAcadApp = (IAcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject(m_sAcadProdID);
if (m_oAcadApp != null)
{
m_oAeccApp = (IAeccApplication)m_oAcadApp.GetInterfaceObject(m_sAeccAppProgId);
m_oAeccDoc = (IAeccDocument)m_oAeccApp.ActiveDocument;
// get the Database object via a late bind
m_oAeccDb = (Autodesk.AECC.Interop.Land.IAeccDatabase)m_oAeccDoc.GetType().GetProperty("Database").GetValue(m_oAeccDoc, null);
long lCount = m_oAeccDb.PointGroups.Count;
m_sMessage += "Number of PointGroups = " + lCount.ToString() + "\n";
lCount = m_oAeccDb.Surfaces.Count;
m_sMessage += "Number of Surfaces = " + lCount.ToString() + "\n\n";
MessageBox.Show(m_sMessage);
m_sMessage = "";
}
}
더 많은 상호운영성 예제는, <Install directory>\Sample\AutoCAD Civil 3D\COM\.에 있는 CSharpClient와 VbDotNetClient샘플 프로젝트를 보라.
Sites and Parcels
Data Bands
Some labels
Pipes : 간섭 체크(간섭 체크 스타일은 제외)
.NET솔루션과 프로젝트를 생성하라.
Project menu나 Solution Explorer에서 Add Reference를 선택하라.
Browse tab에서, Civil 3D 설치 디렉토리로 이동하라, 그리고 다음 COM interop DLL을 선택하라, <domain>은 당신이 사용하기를 원하는 Civil domain이다.(Land, Roadway, Pipe, or Survey)::
- Autodesk.AEC.Interop.Base
- Autodesk.AEC.Interop.UiBase
- Autodesk.AutoCAD.Interop
- Autodesk.AutoCAD.Interop.Common
- Autodesk.AECC.Interop.<domain>
- Autodesk.AECC.Interop.Ui<domain>
위에서의 참조를 선택하라, 그리고 “Copy Local” property를 true로 설정하라, 이 옵션은 모든 참조된 유형을 당신의 대상 assembly에 되함되게 하므로, 참조된 interop DLL들이 런타임에서는 요구되지 않는다.
Autodesk.AutoCAd.Interop와 Autodesk.AECC.Interop.Ui<domain> namespace를 using 또는 Imports 구문에 추가하라.
string m_sAeccAppProgId = "AeccXUiLand.AeccApplication.10.3";
...
private void useCom()
{
//Construct AeccApplication object, Document and Database objects
m_oAcadApp = (IAcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject(m_sAcadProdID);
if (m_oAcadApp != null)
{
m_oAeccApp = (IAeccApplication)m_oAcadApp.GetInterfaceObject(m_sAeccAppProgId);
m_oAeccDoc = (IAeccDocument)m_oAeccApp.ActiveDocument;
// get the Database object via a late bind
m_oAeccDb = (Autodesk.AECC.Interop.Land.IAeccDatabase)m_oAeccDoc.GetType().GetProperty("Database").GetValue(m_oAeccDoc, null);
long lCount = m_oAeccDb.PointGroups.Count;
m_sMessage += "Number of PointGroups = " + lCount.ToString() + "\n";
lCount = m_oAeccDb.Surfaces.Count;
m_sMessage += "Number of Surfaces = " + lCount.ToString() + "\n\n";
MessageBox.Show(m_sMessage);
m_sMessage = "";
}
}
Root Objects와 Common Concepts
이 장은 AutoCAD Civil3D .NET API에 의해서 노출된 다른 모든 object에 접근하기 위해 요구되는 Rootobject로 작업하는 방법을 설명한다.: collections으로 작업하는 방법과 유사한 CivilApplication 과 CivilDocument가 있다.
This chapter explains how to work with the root objects required to access all other objects exposed by the AutoCAD Civil 3D .NET API: CivilApplication and CivilDocument, as well as how to work with collections. It also describes how to work with settings and label styles.
이 절의 주제
-
-
-
-
샘플 프로그램
샘플 프로그램
Root Objects
이 절에서는 기본 객체에 대한 참조를 얻는 방법을 설명한다, 이것은 .NET API를 사용하는 모든 application에게 요구된다. 또한 application, document, 그리고 database object의 사용에 대해서 설명하고, collections을 사용하는 방법을 설명한다, 이것은 보통 .NET API를 통해서 사용된다. 이미 COM에 익숙한 개발자가 기존 코드를 .NET으로 전환하는 것을 돕기위해, 2 API가느이 차이점을 노트로 강조표시 한다.
이 절의 주제
-
Application과 Document Objects에 접근하기
-
-
Application과 Document Objects에 접근하기
Application and Document Objects에 접근하기
AutoCAD Civil 3D .NET 계층에 있는 root object는 CivilApplication object이다. 이것은 현재 활성화된 document와 실행중인 제품에 대한 정보의 참조를 포함한다.
Note
COM API와 달리, CivilApplication은 AutoCAD object인 Autodesk.AutoCAD.ApplicationServices.Application을 상속받지 않는다. 그러므로, 만약 당신이 application-level methods와 properties(열려 있는 모든 document의 collection, 메인 윈도우에 대한 정보와 같은)에 접근할 필요가 있다면, 당신은 AutoCAD Application object를 통해서 접근해야 한다. 이 클래스에 대한 정보를 위해서는 ObjectARX SDK에 있는 ObjectARX Managed Class Reference를 보라.
활성화된 CivilDocument object는 AutodeskCivil.ApplicationServices namespace를 importing하고 CivilApplication.ActiveDocument property를 getting하는 것으로 접근된다.
이 예제는 CivilApplication과 CivilDocument에 접근하는 프로세스를 보여준다 :
using Autodesk.Civil.ApplicationServices;
namespace CivilSample {
class CivilExample {
CivilDocument doc = CivilApplication.ActiveDocument;
}
}
namespace CivilSample {
class CivilExample {
CivilDocument doc = CivilApplication.ActiveDocument;
}
}
Document Object에 있는 Collections 사용하기
document object는 AutoCAD Civil 3D drawing element(point와 선형같은 것)의 collections을 포함하고 있을뿐만 아니라, 그런 element를 수정하는 object(style과 label style같은 것)도 포함하고 있다. CivilDocument에 있는 collections은 대부분의 object대한 ObjectID collections(Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection)이다. 이런 collections에 잇는 objects는 Transaction.GetObject()로 검색되어야 한다, 그리고 사용할 수 있기 전에 해당 type으로 캐스팅 되어야 한다.
Note
COM API에서, document objects는 cast될 필요가 없는 objects의 collections에 포함되어 있다.
ObjectIdCollection objects는 iList interface를 구현한다, 그리고 index에 의해서 열거되거나 접근될 수 있다.여기 foreach로 Corridor collection을 통해서 반복하고, 얻고, 그 method와 properties로 접근하기위해 결과 ObjectId를 Corridor로 캐스팅 하는 하는 샘플이 있다:
public static void iterateCorridors () {
CivilDocument doc = CivilApplication.ActiveDocument;
using ( Transaction ts = Application.DocumentManager.MdiActiveDocument.
Database.TransactionManager.StartTransaction() ) {
foreach ( ObjectId objId in doc.CorridorCollection ) {
Corridor oCorridor = ts.GetObject(objId, OpenMode.ForRead) as Corridor;
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Corridor: {0}\nLargest possible triangle side: {1}\n",
oCorridor.Name, oCorridor.MaximumTriangleSideLength);
}
}
}
ObjectIdCollections에 대한 더 많은 정보는, Civil 3D .NET API Reference를 참조하라.
이 예제는 새로운 point style을 생성한다.
ObjectId pointStyleID = doc.Styles.PointStyles.Add("Name");
// Now a new point style is added to the collection of styles,
// and we can modify it by setting the properties
// of the oPointStyle object, which we get from the Transaction ts:
PointStyle oPointStyle = ts.GetObject(pointStyleID, OpenMode.ForWrite) as PointStyle;
oPointStyle.Elevation = 114.6;
// You must commit the transaction for the add / modify operation
// to take effect
ts.Commit();
만약 당신이 이미 존재하는 element와 동일한 properties로 새 element를 추가하려고 하거나, 존재지 않는 item에 접근하려 하거나, 존재하지 않거나 사용중인 item을 제거하려 한다면 error가 발생할 것이다. 당신은 오류를 잡고 그에 따라 대응해야 한다.
다음 예제는 그런 오류를 처리하는 한가지 방법을 보여준다.
The following sample demonstrates one method of dealing with such errors:
// Try to access the style named "Name"
try {
// This raises an ArgumentException if the item doesn't
// exist:
ObjectId pointStyleId = doc.Styles.PointStyles["Name"];
// do something with the point style...
} catch ( ArgumentException e ) {
ed.WriteMessage(e.Message);
}
CivilDocument doc = CivilApplication.ActiveDocument;
using ( Transaction ts = Application.DocumentManager.MdiActiveDocument.
Database.TransactionManager.StartTransaction() ) {
foreach ( ObjectId objId in doc.CorridorCollection ) {
Corridor oCorridor = ts.GetObject(objId, OpenMode.ForRead) as Corridor;
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Corridor: {0}\nLargest possible triangle side: {1}\n",
oCorridor.Name, oCorridor.MaximumTriangleSideLength);
}
}
}
// Now a new point style is added to the collection of styles,
// and we can modify it by setting the properties
// of the oPointStyle object, which we get from the Transaction ts:
PointStyle oPointStyle = ts.GetObject(pointStyleID, OpenMode.ForWrite) as PointStyle;
oPointStyle.Elevation = 114.6;
// You must commit the transaction for the add / modify operation
// to take effect
ts.Commit();
try {
// This raises an ArgumentException if the item doesn't
// exist:
ObjectId pointStyleId = doc.Styles.PointStyles["Name"];
// do something with the point style...
} catch ( ArgumentException e ) {
ed.WriteMessage(e.Message);
}
Database Object를 접근하고 사용하기
CivilDocument 클래스는 document와 관련된 기본 database 는 노출하지 않는다. 하지만, 당신은 AutoCADApplication.DocumentManager.MdiActiveDocument.Database object를 통해서 에서 database에 접근할 수 있다. Database object는 기본 AutoCAD entities뿐만 아니라 AutoCAD Civil 3D entities의 참조를 포함한다. 자세한 내용은 ObjectARX SDK에 있는 ObjectARX Managed Class Reference를 보라
Settings
이절은 document setting objects의 목적과 용도를 설명하고 일반과 특수 setting의 변경을 설명한다.
This section explains the purpose and use of the document settings objects, and covers changing general and specific settings.
이 절의 주제
-
Drawing, Feature 그리고 Command Setting에 접근하기
Drawing, Feature 그리고 Command Setting에 접근하기
Drawing, Feature 그리고 Command Settings에 접근하기
Setting은 AutoCAD Civil 3D에서 3가지 레벨에 적용됩니다.
-
Drawing 레벨: units와 zone, abbreviations등과 같은 전체도면 settings이 있다, ambient setting도 있다. 이것은 AutoCAD Civil 3D 행동의 종류에 관여한다. 이런 setting들이 전체도면에 적용되지만, feature나 command level에서 재정의 될 수 있다.
-
Feature(object) 레벨 : ambient 설정은 feature만을 위한 drawing level ambient setting보다 우선한다.
-
Command 레벨 : ambient 설정은 명령단위로 설정될 수 있다. 이런 설정은 drawing 레벨과 feature 레벨 설정 모두보다 우선한다.
Document의 설정은 SettingRoot object의 properties를 통해서 접근되고, SettingRoot object는 Document.Setting property에서 얻어진다. 이 object는 DrawingSetting property(SettingDrawing 유형)를 포함하고, document를 위한 모든 최상위 레벨의 ambient 설정을 포함한다. 또한 GetSetting() 메서드를 갖고 있고, GetSetting() 매서드는 feature와 command 설정을 가져온다.
Drawing 설정과 일반 ambient 설정은 Autodesk.Civil.Settings namespace에 있다, feature와 command 설정은 관련 기능의 namespace에 있다. 예를들어, 선형 관련 ambient와 command 설정은 Autodesk.Civil.Land.Settings namespace에 있다.
다음 샘플은 선형의 각도 설정에 접근하는 방법을 보여준다 :
SettingsAlignment alignmentSettings = doc.Settings.GetSettings<SettingsAlignment>();
Autodesk.Civil.Settings.SettingsAmbient.SettingsAngle angleSettings = alignmentSettings.Angle;
ed.WriteMessage(@"Alignment settings:\n Precision: {0}\n Rounding: {1}
Unit: {2}\n Drop Decimal: {3}\n DropZeros: {4}\n ",
angleSettings.Precision.Value, angleSettings.Rounding.Value,
angleSettings.Unit.Value, angleSettings.DropDecimalForWholeNumbers.Value,
angleSettings.DropLeadingZerosForDegrees.Value);
Command 설정은 command에 적용하고, AutoCAD Civil 3D Toolspace 설정 Tab의 각각의 항목에 대한 Commands 폴더의 설정에 해당한다. 각각의 command 설정은 SettingsCmdCommandName으로 명명된 클래스와 대응된다. 예를들어, CreateAlignmentLayout command와 대응되는 설정 클래스는 SettingsCmdCreateAlignmentLayout이다. 설정의 다른 유형 과 마찬가지로, 당신은 CivilDocument.Settings.GetSetting() 매서드를 사용해서 document에 있는 command 설정 object에 접근한다.
다음 스닙펫은 “Alignment Type Option”이 CreateAlignmentLayout command를 위한 “Alignment Type Option”이 무엇인지를 결정한다.
SettingsCmdCreateAlignmentLayout alignLayoutCmdSettings = doc.Settings.GetSettings<SettingsCmdCreateAlignmentLayout>();
ed.WriteMessage(@"Alignment Layout Command settings: AlignmentType: {0} ",
alignLayoutCmdSettings.AlignmentTypeOption.AlignmentType.Value
);
이 코드의 결과는 현재 command setting을 리턴한 :.
command 설정을 가져오기
Drawing 레벨: units와 zone, abbreviations등과 같은 전체도면 settings이 있다, ambient setting도 있다. 이것은 AutoCAD Civil 3D 행동의 종류에 관여한다. 이런 setting들이 전체도면에 적용되지만, feature나 command level에서 재정의 될 수 있다.
Feature(object) 레벨 : ambient 설정은 feature만을 위한 drawing level ambient setting보다 우선한다.
Command 레벨 : ambient 설정은 명령단위로 설정될 수 있다. 이런 설정은 drawing 레벨과 feature 레벨 설정 모두보다 우선한다.
Autodesk.Civil.Settings.SettingsAmbient.SettingsAngle angleSettings = alignmentSettings.Angle;
ed.WriteMessage(@"Alignment settings:\n Precision: {0}\n Rounding: {1}
Unit: {2}\n Drop Decimal: {3}\n DropZeros: {4}\n ",
angleSettings.Precision.Value, angleSettings.Rounding.Value,
angleSettings.Unit.Value, angleSettings.DropDecimalForWholeNumbers.Value,
angleSettings.DropLeadingZerosForDegrees.Value);
ed.WriteMessage(@"Alignment Layout Command settings: AlignmentType: {0} ",
alignLayoutCmdSettings.AlignmentTypeOption.AlignmentType.Value
);
Label Styles
이 절은 label style의 일반적인 기능을 설명한다. 그리고 새 label style object 생성을 설명하고, label style을 정의하고, label style text strings에서 property 필드를 사용하는 것을 설명한다. 각 구성에 대한 세부사항은 이번 장에서 설명된다.
이 절의 주제
-
Label Style Object 생성하기
-
Label Style 정의하기
-
Label Style Text에서 Property 필드 사용하기
-
Drawing간 Style 공유하기
Label Style Object 생성하기
Label Style 정의하기
Label Style Text에서 Property 필드 사용하기
Drawing간 Style 공유하기
Label Style Object 생성하기
AutoCAD Civil 3D 요소를 위한 주석의 모든 종류는 레이블 스타일에 의해서 제어되고, 레이블 스타일은 LabelStyle 유형의 객체들이다. Label style은 문자레이블, 틱 마크, 선, 마커, 그리고 방향 화살표들을 포함할수 있다.
다음 예제는 점과 함께 사용될 수 있는 새 레이블 스타일 객체를 생성한다 :
CivilDocument doc = CivilApplication.ActiveDocument;
ObjectId labelStyleId;
labelStyleId = doc.Styles.LabelStyles.PointLabelStyles.LabelStyles.Add
("New Point Label Style");
ObjectId labelStyleId;
labelStyleId = doc.Styles.LabelStyles.PointLabelStyles.LabelStyles.Add
("New Point Label Style");
레이블 스타일 정의하기
레이블 스타일은 “components”라는 레이블의 다른 기능의 collection으로 구성되어 있다. 이 component의 collection은 LabelStyle::GetComponents() 매서드로 접근되고, 이 매서드는 가져올 component의 유형(LabelStylecomponentType)을 가진다. Component유형은 다음과 같다:
-
Text
-
Line
-
Block - symbols
-
Tick - for both major and minor tick marks
-
ReferenceText
-
DirectionArrow
-
TextForEach
이 모든 것들이 유효하지는 않은데, 이는 레이블 스타일 유형을 따른다. 예를 들어, 점에 대한 레이블 스타일에 눈금 compomnent를 추가하면 눈에 띄는 효과가 없습니다. 레이블 스타일은 또한 그래픽 객체에 의존한다. 그 그래픽 객체는 현재 document의 일부이거나 아닐수도 이다. 예를 들어, 스타일이 현재 document의 일부가 아닌 블럭을 참조한다면, 그 특정 블럭이나 틱 component는 보이지 않게 된다.
레이블 스타일에 기능을 추가하기는 LabelStyle::AddComponent() 매서드를 사용해서 새 component를 대응되는 collection에 추가한다. 그런다음 그 component의 속성을 적절한 값으로 설정한다. 언제나 Visible 속성은 true로 설정하라.
try
{
// Add a line to the collection of lines in our label style
ObjectId lineComponentId = oLabelStyle.AddComponent("New Line Component", LabelStyleComponentType.Line);
// Get the new component:
ObjectIdCollection lineCompCol = oLabelStyle.GetComponents(LabelStyleComponentType.Line);
var newLineComponent = ts.GetObject(lineComponentId, OpenMode.ForWrite) as LabelStyleLineComponent;
// Now we can modify the component
newLineComponent.General.Visible.Value = true;
newLineComponent.Line.Color.Value = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 40); // orange-yellow
newLineComponent.Line.Angle.Value = 2.094; // radians, = 120 deg
// negative lengths are allowed - they mean the line is drawn
// in the opposite direction to the angle specified:
newLineComponent.Line.Length.Value = -0.015;
newLineComponent.Line.StartPointXOffset.Value = 0.005;
newLineComponent.Line.StartPointYOffset.Value = -0.005;
}
// Thrown if component isn't valid, or name is duplicated
catch (System.ArgumentException e)
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Error: {0}\n", e.Message);
}
처음 생성될때, 레이블 스타일 객체는 ambient 설정을 따라 설정된다. 이 때문에, 새 레이블 스타일 객체는 이미 feature를 포함할수도 있다. 만약 당신이 새 레이블 스타일 객체를 생성하고 있다면, 그런 기존 feature나 스타일이 의도치 않은 요소를 포함하고 있는지 체크를 해야 한다.
// Check to see whether any text components already exist.
// If not, add one.
if (oLabelStyle.GetComponentsCount(LabelStyleComponentType.Text) == 0)
{
// Add a text component
oLabelStyle.AddComponent("New Text ", LabelStyleComponentType.Text);
}
// Now modify the first one:
ObjectIdCollection textCompCol = oLabelStyle.GetComponents(LabelStyleComponentType.Text);
var newTextComponent = ts.GetObject(textCompCol[0], OpenMode.ForWrite) as LabelStyleTextComponent;
Ambient 설정은 단위가 사용되는지도 정의한다. 만약 당신이 다른 도면으로 작업하도록 설계된 application을 개발하고 있다면, ambient 설정을 계정에 주어라 그렇지 않으면 레이블은 각각의 document에서 예상치 못한 동작을 보일수도 있다.
Text
Line
Block - symbols
Tick - for both major and minor tick marks
ReferenceText
DirectionArrow
TextForEach
{
// Add a line to the collection of lines in our label style
ObjectId lineComponentId = oLabelStyle.AddComponent("New Line Component", LabelStyleComponentType.Line);
// Get the new component:
ObjectIdCollection lineCompCol = oLabelStyle.GetComponents(LabelStyleComponentType.Line);
var newLineComponent = ts.GetObject(lineComponentId, OpenMode.ForWrite) as LabelStyleLineComponent;
// Now we can modify the component
newLineComponent.General.Visible.Value = true;
newLineComponent.Line.Color.Value = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 40); // orange-yellow
newLineComponent.Line.Angle.Value = 2.094; // radians, = 120 deg
// negative lengths are allowed - they mean the line is drawn
// in the opposite direction to the angle specified:
newLineComponent.Line.Length.Value = -0.015;
newLineComponent.Line.StartPointXOffset.Value = 0.005;
newLineComponent.Line.StartPointYOffset.Value = -0.005;
}
// Thrown if component isn't valid, or name is duplicated
catch (System.ArgumentException e)
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Error: {0}\n", e.Message);
}
// If not, add one.
if (oLabelStyle.GetComponentsCount(LabelStyleComponentType.Text) == 0)
{
// Add a text component
oLabelStyle.AddComponent("New Text ", LabelStyleComponentType.Text);
}
// Now modify the first one:
ObjectIdCollection textCompCol = oLabelStyle.GetComponents(LabelStyleComponentType.Text);
var newTextComponent = ts.GetObject(textCompCol[0], OpenMode.ForWrite) as LabelStyleTextComponent;
레이블 스타일 텍스트의 Property 필드 사용
레이블에 있는 텍스트는 LabelStyleTextComponent.Contexts property, PropertyString value에 의해서 지정된다. 물론, 텍스트 레이블이 각 특정 항목에 고유한 정보를 제공할 수 있다면 가장 유용하다. 이것은 문자열내에 속성 필드를 지정하는것에 의해서 수행된다. 이 속성 필드는 “<[Property name(modifier 1|[..] modifier n)]>”의 형식이다. 값 변경자는 옵션사항이고 임의의 순서로 지정할 수 있다. 속성필드의 임의의 숫자는 속성 내용인 일반 텍스트와 조합될 수 있다.
이 예제는, 레이블의 문자열 component가 수정되어서 선형의 좌표에 대한 을 따르는 좌표에 설계속도와 측점값으로 보여진다 :
var newTextComponent = ts.GetObject(textCompCol[0], OpenMode.ForWrite) as LabelStyleTextComponent;
newTextComponent.Text.Contents.Value = "SPD=<[Design Speed(P0|RN|AP|Sn)]>";
newTextComponent.Text.Contents.Value += "STA=<[Station Value(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>";
각각의 요소에 대한 유효한 속성 필드는 적절한 장에서 나열된다.
newTextComponent.Text.Contents.Value = "SPD=<[Design Speed(P0|RN|AP|Sn)]>";
newTextComponent.Text.Contents.Value += "STA=<[Station Value(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>";
도면간 스타일 공유하기
모든 스타일 객체와 마찬가지로, 레이블 스타일은 도면간에 공유될 수 있다. 이것을 하기 위해서는, 스타일의 ExportTo()를 호출하라, 이 호출은 스타일을 추가할 도면을 대상으로 호출한다.
Note
또한 스타일의 collections을 다른 도면으로 내보내기할 수 있는데, static StyleBase::ExportTo() 매서드를 통해서 할수 있다.
스타일을 export할때, 충돌을 해결하는 방법을 방법을 지정하는데, StyleConflictResolverType enum을 사용해서 지정한다. 이 예제에서는, MajorStationLabelStyles collection에 있는 첫번째 스타일이 내보내지는데, 활성화된 도면에서 열려있는 다른 도면(Drawing1.dwg)으로 내보내 진다 :
[CommandMethod("ExportStyle")]
public void ExportStyle()
{
CivilDocument doc = CivilApplication.ActiveDocument;
Document AcadDoc = Application.DocumentManager.MdiActiveDocument;
Database destDb = null;
// Find the database for "Drawing 1"
foreach (Document d in Application.DocumentManager)
{
if (d.Name.Equals("Drawing1.dwg")) destDb = d.Database;
}
// cancel if no matching drawing:
if (destDb == null) return;
using (Transaction ts = AcadDoc.Database.TransactionManager.StartTransaction())
{
// Export style:
ObjectId styleId = doc.Styles.LabelStyles.AlignmentLabelStyles.MajorStationLabelStyles[0];
LabelStyle oLabelStyle = ts.GetObject(styleId, OpenMode.ForRead) as LabelStyle;
oLabelStyle.ExportTo(destDb, Autodesk.Civil.StyleConflictResolverType.Rename);
}
}
Note
특정 상황에서 ExportTo()를 호출할때 트랜잭션을 중단하려는 시도가 실패한다. 이것은 모든 따라오는 조건들이 TRUE이기 때문이다 : 여러개의 스타일이 export되고 있다면, 스타일간의 이름 지정이 충돌이 발생한다, 그리고 StyleConflictResolverType은 StyleconflictResolverType.Override이다.
public void ExportStyle()
{
CivilDocument doc = CivilApplication.ActiveDocument;
Document AcadDoc = Application.DocumentManager.MdiActiveDocument;
Database destDb = null;
// Find the database for "Drawing 1"
foreach (Document d in Application.DocumentManager)
{
if (d.Name.Equals("Drawing1.dwg")) destDb = d.Database;
}
// cancel if no matching drawing:
if (destDb == null) return;
using (Transaction ts = AcadDoc.Database.TransactionManager.StartTransaction())
{
// Export style:
ObjectId styleId = doc.Styles.LabelStyles.AlignmentLabelStyles.MajorStationLabelStyles[0];
LabelStyle oLabelStyle = ts.GetObject(styleId, OpenMode.ForRead) as LabelStyle;
oLabelStyle.ExportTo(destDb, Autodesk.Civil.StyleConflictResolverType.Rename);
}
}
댓글 없음:
댓글 쓰기