AutoCAD Civil 3D API Developers Guide
AutoCAD Civil 3D API Developers Guide
AutoCAD
A Civil 3D® 2013
2
API
A Deveelop
per’s Guiide
April 2012
www.EngineeringBooksPdf.com
Contents
www.EngineeringBooksPdf.com
Accessing Drawing, Feature, and Command Settings . . . . 24
Label Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Creating a Label Style Object . . . . . . . . . . . . . . . . . 27
Defining a Label Style . . . . . . . . . . . . . . . . . . . . . 27
Using Property Fields in Label Style Text . . . . . . . . . . . 29
Sharing Styles Between Drawings . . . . . . . . . . . . . . . 30
Sample Programs . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Accessing Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Surface Properties . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Creating Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Creating a TIN Surface from a TIN file . . . . . . . . . . . . 36
Creating a TIN Surface using TinSurface.Create() . . . . . . 37
Creating a Grid Surface from a DEM File . . . . . . . . . . . 39
Creating a GridSurface with GridSurface.Create() . . . . . . 40
Creating a Volume Surface . . . . . . . . . . . . . . . . . . 41
Working with Surfaces . . . . . . . . . . . . . . . . . . . . . . . 42
Adding a Boundary . . . . . . . . . . . . . . . . . . . . . . 42
Adding Data from DEM Files . . . . . . . . . . . . . . . . . 44
Improving Performance by Using Snapshots . . . . . . . . . 44
Working with TIN Surfaces . . . . . . . . . . . . . . . . . . . . . 45
Adding Point Data to a TIN Surface . . . . . . . . . . . . . . 45
Adding Points Using Point Groups . . . . . . . . . . . . . . 48
Smoothing a TIN Surface . . . . . . . . . . . . . . . . . . . 48
Adding A Breakline to a TIN Surface . . . . . . . . . . . . . 50
Adding a Wall Breakline . . . . . . . . . . . . . . . . . . . 53
Importing Breaklines from a File . . . . . . . . . . . . . . . 53
Adding Contours to a TIN Surface . . . . . . . . . . . . . . 54
Extracting Contours . . . . . . . . . . . . . . . . . . . . . . 55
Surface Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Creating and Changing a Style . . . . . . . . . . . . . . . . 57
Assigning a Style to a Surface . . . . . . . . . . . . . . . . . 58
Surface Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Creating an Elevation Analysis . . . . . . . . . . . . . . . . 60
Accessing a Watershed Analysis . . . . . . . . . . . . . . . . 62
Calculating Bounded Volumes . . . . . . . . . . . . . . . . 63
Alignments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Basic Alignment Operations . . . . . . . . . . . . . . . . . . . . 65
Creating an Alignment . . . . . . . . . . . . . . . . . . . . 65
Defining an Alignment Path Using Entities . . . . . . . . . 67
Determining Entities Within an Alignment . . . . . . . . . 68
Stations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Modifying Stations with Station Equations . . . . . . . . . 70
Creating Station Sets . . . . . . . . . . . . . . . . . . . . . 70
Specifying Design Speeds . . . . . . . . . . . . . . . . . . . 71
Finding the Location of a Station . . . . . . . . . . . . . . . 72
ii | Contents
www.EngineeringBooksPdf.com
Superelevation . . . . . . . . . . . . . . . . . . . . . . . . . 72
Alignment Style . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Creating an Alignment Style . . . . . . . . . . . . . . . . . 74
Alignment Label Styles . . . . . . . . . . . . . . . . . . . . 76
Sample Programs . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Creating a Profile From a Surface . . . . . . . . . . . . . . . 79
Creating a Profile Using Entities . . . . . . . . . . . . . . . 80
Editing Points of Vertical Intersection . . . . . . . . . . . . 82
Creating a Profile Style . . . . . . . . . . . . . . . . . . . . 83
Profile Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Creating a Profile View . . . . . . . . . . . . . . . . . . . . 85
Creating Profile View Styles . . . . . . . . . . . . . . . . . . 86
Setting Profile View Styles . . . . . . . . . . . . . . . . . . . 86
Sample Programs . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Pipe Networks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Base Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Accessing Pipe Network-Specific Base Objects . . . . . . . . 92
Pipe-Specific Ambient Settings . . . . . . . . . . . . . . . . 92
Listing and Adding Dynamic Part Properties . . . . . . . . . 93
Retrieving the Parts List . . . . . . . . . . . . . . . . . . . . 94
Creating a Pipe Network . . . . . . . . . . . . . . . . . . . 96
Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Creating Pipes . . . . . . . . . . . . . . . . . . . . . . . . . 98
Using Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Creating Pipe Styles . . . . . . . . . . . . . . . . . . . . . 100
Creating Pipe Label Styles . . . . . . . . . . . . . . . . . . 103
Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Creating Structures . . . . . . . . . . . . . . . . . . . . . 103
Using Structures . . . . . . . . . . . . . . . . . . . . . . . 103
Creating Structure Styles . . . . . . . . . . . . . . . . . . . 104
Creating Structure Label Styles . . . . . . . . . . . . . . . 105
Interference Checks . . . . . . . . . . . . . . . . . . . . . . . . 106
Performing an Interference Check . . . . . . . . . . . . . 106
Listing the Interferences . . . . . . . . . . . . . . . . . . . 106
Interference Check Styles . . . . . . . . . . . . . . . . . . 106
Sample Program . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Corridors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Root Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Accessing Corridor-Specific Base Objects . . . . . . . . . . 108
Ambient Settings . . . . . . . . . . . . . . . . . . . . . . . 109
Corridors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Corridor Concepts . . . . . . . . . . . . . . . . . . . . . . 112
Listing Corridors . . . . . . . . . . . . . . . . . . . . . . . 112
Creating Corridors . . . . . . . . . . . . . . . . . . . . . . 113
Contents | iii
www.EngineeringBooksPdf.com
Baselines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Listing Baselines in a Corridor . . . . . . . . . . . . . . . . 114
Adding a Baseline to a Corridor . . . . . . . . . . . . . . . 114
Listing Baseline Regions . . . . . . . . . . . . . . . . . . . 114
Accessing and Modifying Baseline Stations . . . . . . . . . 115
Listing Offset Baselines . . . . . . . . . . . . . . . . . . . 116
Assemblies and Subassemblies . . . . . . . . . . . . . . . . . . . 117
Listing Applied Assemblies in a Baseline Region . . . . . . 118
Getting Applied Subassembly Information . . . . . . . . . 119
Feature Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Listing Feature Lines Along a Baseline . . . . . . . . . . . 120
Listing Feature Lines Along Offset Baselines . . . . . . . . 121
Corridor Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Listing Corridor Surfaces . . . . . . . . . . . . . . . . . . . 122
Listing Surface Boundaries . . . . . . . . . . . . . . . . . . 123
Computing Cut and Fill . . . . . . . . . . . . . . . . . . . 125
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Assembly Style . . . . . . . . . . . . . . . . . . . . . . . . 125
Link Style . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Shape Style . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Roadway Style Sets . . . . . . . . . . . . . . . . . . . . . . 127
Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Using the Points Collection . . . . . . . . . . . . . . . . . . . . 128
Using Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Bulk Editing Points . . . . . . . . . . . . . . . . . . . . . 130
Point User-Defined Properties . . . . . . . . . . . . . . . . 131
Point Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Using Point Groups . . . . . . . . . . . . . . . . . . . . . 134
Adding Points to Point Groups with Queries . . . . . . . . 135
Point Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Creating Point Styles . . . . . . . . . . . . . . . . . . . . . 139
Creating Point Label Styles . . . . . . . . . . . . . . . . . 140
Using Point Description Keys . . . . . . . . . . . . . . . . 141
Creating Custom Subassemblies Using .NET . . . . . . . . . . . . . . 143
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Subassembly Changes . . . . . . . . . . . . . . . . . . . . . . . 144
Designing Custom Subassemblies . . . . . . . . . . . . . . . . . 146
Naming Custom Subassemblies . . . . . . . . . . . . . . . 146
Attachment and Insertion Methodology . . . . . . . . . . 146
User-defined vs. Hard-coded Parameters . . . . . . . . . . 147
Input Parameter Types . . . . . . . . . . . . . . . . . . . . 148
Superelevation Behavior and Subassemblies . . . . . . . . 149
Creating Subassembly Help Files . . . . . . . . . . . . . . 152
Structure of Subassembly Programs . . . . . . . . . . . . . . . . 156
The Subassembly Template (SATemplate.vb) . . . . . . . . 156
The Corridor State Object . . . . . . . . . . . . . . . . . . 157
iv | Contents
www.EngineeringBooksPdf.com
Support Files (CodesSpecific.vb, Utilities.vb) . . . . . . . . 157
Sample VB.NET Subassembly . . . . . . . . . . . . . . . . . . . 160
The Subassembly Tool Catalog . . . . . . . . . . . . . . . . . . 174
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Creating a Tool Catalog ATC File . . . . . . . . . . . . . . 175
Creating a Tool Catalog Cover Page . . . . . . . . . . . . . 185
Creating a Tool Catalog Registry File . . . . . . . . . . . . 186
Installing Custom Subassemblies . . . . . . . . . . . . . . . . . 188
Exporting Custom Subassemblies Using a Package File . . . . . . 189
Exporting Custom Subassemblies Using a Package
File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Converting VBA Subassemblies to .NET . . . . . . . . . . . . . . . . . 191
Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Create the Visual Basic.NET Subassembly Module . . . . . 191
Copy Subassembly Code . . . . . . . . . . . . . . . . . . . 193
Port the VBA Code to Visual Basic .NET Code . . . . . . . 193
Final Adjustments . . . . . . . . . . . . . . . . . . . . . . 202
Installing the New Subassembly . . . . . . . . . . . . . . . 202
Replacing the VBA Subassembly . . . . . . . . . . . . . . . 202
Legacy COM API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Using VBA in AutoCAD Civil 3D . . . . . . . . . . . . . . . . . 203
Root Objects and Common Concepts in COM . . . . . . . . . . 204
Root Objects . . . . . . . . . . . . . . . . . . . . . . . . . 204
Ambient Settings . . . . . . . . . . . . . . . . . . . . . . . 208
Label Styles . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Survey in COM . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 216
Root Objects . . . . . . . . . . . . . . . . . . . . . . . . . 217
Survey Network . . . . . . . . . . . . . . . . . . . . . . . 222
Figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Sample Program . . . . . . . . . . . . . . . . . . . . . . . 233
Points in COM . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 234
Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Point Groups . . . . . . . . . . . . . . . . . . . . . . . . . 243
Sample Program . . . . . . . . . . . . . . . . . . . . . . . 246
Surfaces in COM . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 247
Using the Surfaces Collection . . . . . . . . . . . . . . . . 248
Creating a Surface . . . . . . . . . . . . . . . . . . . . . . 249
Working with Surfaces . . . . . . . . . . . . . . . . . . . . 252
Working with TIN Surfaces . . . . . . . . . . . . . . . . . 258
Surface Style . . . . . . . . . . . . . . . . . . . . . . . . . 264
Performing Surface Analysis . . . . . . . . . . . . . . . . . 266
Sample Programs . . . . . . . . . . . . . . . . . . . . . . . 273
Contents | v
www.EngineeringBooksPdf.com
Sites and Parcels in COM . . . . . . . . . . . . . . . . . . . . . 275
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 275
Sites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Parcels . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Sample Program . . . . . . . . . . . . . . . . . . . . . . . 284
Alignments in COM . . . . . . . . . . . . . . . . . . . . . . . . 284
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 285
Basic Alignment Operations . . . . . . . . . . . . . . . . . 286
Stations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Alignment Style . . . . . . . . . . . . . . . . . . . . . . . 293
Sample Program . . . . . . . . . . . . . . . . . . . . . . . 296
Profiles in COM . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 298
Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Profile Views . . . . . . . . . . . . . . . . . . . . . . . . . 303
Sample Programs . . . . . . . . . . . . . . . . . . . . . . . 307
Sections in COM . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 308
Sample Lines . . . . . . . . . . . . . . . . . . . . . . . . . 309
Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Section Views . . . . . . . . . . . . . . . . . . . . . . . . 318
Sample Program . . . . . . . . . . . . . . . . . . . . . . . 324
Data Bands in COM . . . . . . . . . . . . . . . . . . . . . . . . 326
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 326
Defining a Data Band Style . . . . . . . . . . . . . . . . . 327
Creating a Data Band Set . . . . . . . . . . . . . . . . . . 345
Using Data Bands . . . . . . . . . . . . . . . . . . . . . . 347
Sample Programs . . . . . . . . . . . . . . . . . . . . . . . 349
Pipe Networks in COM . . . . . . . . . . . . . . . . . . . . . . 349
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 350
Base Objects . . . . . . . . . . . . . . . . . . . . . . . . . 351
Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Structures . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Interference Checks . . . . . . . . . . . . . . . . . . . . . 369
Sample Program . . . . . . . . . . . . . . . . . . . . . . . 374
Corridors in COM . . . . . . . . . . . . . . . . . . . . . . . . . 375
Root Objects . . . . . . . . . . . . . . . . . . . . . . . . . 375
Corridors . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Baselines . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Assemblies and Subassemblies . . . . . . . . . . . . . . . . 387
Feature Lines . . . . . . . . . . . . . . . . . . . . . . . . . 391
Corridor Surfaces . . . . . . . . . . . . . . . . . . . . . . . 395
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Sample Program . . . . . . . . . . . . . . . . . . . . . . . 402
Object Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . 402
AutoCAD Civil 3D . . . . . . . . . . . . . . . . . . . . . 402
vi | Contents
www.EngineeringBooksPdf.com
Creating Client Applications . . . . . . . . . . . . . . . . . . . 404
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Samples . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Contents | vii
www.EngineeringBooksPdf.com
viii
www.EngineeringBooksPdf.com
API Developer's Guide
1
About the Developer's Guide
Intended Audience
The is designed for developers who want to customize AutoCAD® Civil 3D® or
create applications using the underlying APIs. It can also be used for creating
macros to automate repetitive tasks for AutoCAD Civil 3D users and for
developers of custom subassemblies.
www.EngineeringBooksPdf.com
The COM and .NET APIs are described in this guide. For more information
about the Custom Draw API, see the Custom Draw API Reference
(civildraw-reference.chm).
In addition, an API is provided for creating custom subassemblies in .NET. See
Creating Custom Subassemblies Using .NET (page 143).
Which API you choose to use depends on what you want to do:
Customize the way objects are rendered in the Custom Draw API. The Custom Draw
AutoCAD Civil 3D API is an extension of the AutoCAD Ob-
jectARX API. For example, if you wanted to
number the triangles on a TIN surface, you
could create a DLL using the Custom Draw
API. See the sample applications shipped
with AutoCAD Civil 3D for an example.
NOTE
Where possible, you should use the Civil .NET API instead of the COM API,
especially for longer operations, as the .NET API is a thin layer to Civil objects
and has better performance. However, you may find you need to use the COM
object to access some functionality or object members that are not yet exposed
by the .NET API. In this case it's possible to use both. See Limitations and Using
Interop (page 19) .
Organization
This guide is organized by the major features of AutoCAD Civil 3D. It consists
of the following chapters, each of which includes samples from applicable
APIs taken from one or more demonstration programs:
www.EngineeringBooksPdf.com
Chapter 1: Getting Started (page 9)
Explains how to set up a COM and .NET project. Also discusses porting COM
to .NET code, limitations of the .NET API, and how to use interop to access
COM objects.
Explains how to obtain the base .NET objects representing the documents and
databases, which are required for all subsequent chapters. Also discussed are
objects common to many features, such as ambient settings and label styles.
Explains how to import surfaces from files, manipulate point data directly,
insert breaklines, manage borders, modify contours, and analyze elevation
and watershed information.
Explains the creation of profiles and profile styles, using the .NET API.
www.EngineeringBooksPdf.com
Chapter 9: Creating Custom Subassemblies (page 143)
Explains how to create and install custom subassemblies using Visual Basic
.NET and the creation of catalog files which enables users to access custom
subassemblies. You can also convert subassemblies written in VBA to .NET
(see the Appendix Converting VBA Subassemblies to .NET (page 191) for more
information).
Points
COGO points and related features are now fully supported in the .NET API
with these new classes:
■ CogoPoint class: exposes Coordinate Geometry (COGO) points , including
styles and labels.
■ PointGroup class: exposes point groups.
■ CivilDocument.PointGroups is the collection of all point groups in the
drawing.
■ CogoPoint.PrimaryPointGroupId indicates the primary point group a
CogoPoint belongs to.
■ Point Group Queries: Standard and custom point group queries are exposed:
StandardPointGroupQuery and CustomPointGroupQuery classes.
www.EngineeringBooksPdf.com
■ Description keys are exposed with the PointDescriptionKey class. The
collection of all point description key sets in a drawing is accessed with
the static
PointDescriptionKeySetCollection.GetPointDescriptionKeySets()
method.
Surfaces
■ You can now extract contour information from a surface with several new
ExtractContours*() and related methods.
Profile Views
Labels
The following changes have been made to the Labels API in this release:
■ Parcel Area labels are exposed (ParcelAreaLabel class). These labels are
obtained from the Parcel.GetAvailableParcelAreaLabelIds() method.
■ Pipe labels are exposed: PipeLabel, SpanningPipeLabel, PipeProfileLabel,
PipeSectionLabel, SpanningPipeProfileLabel, StructureLabel,
StructureProfileLabel and StructureSectionLabel classes.
www.EngineeringBooksPdf.com
■ General labels: NoteLabel, GeneralSegmentLabel
■ Intersection Label: IntersectionLocationLabel
■ The GetAvailableLabelGroups() method for existing *LabelGroup classes
is deprecated in favor of the more accurately named
GetAvailableLabelGroupIds().
Transportation
Survey
www.EngineeringBooksPdf.com
(SurveyQueriesAddPointDefinition, SurveyQueriesAddFigureDefinition,
SurfaceOperationAddPointSurveyQuery, and
SurfaceOperationAddFigureSurveyQuery class). Users can now add data
for a TinSurface with a survey query, and access the properties of a surface
operation with a survey query.
COM Changes
If you are using the COM API, you need to update the object version to 10.0
(from 9.0 used in AutoCAD Civil 3D 2012). The objects and interfaces exposed
have remained the same, but you should reference the new libraries, which
are installed by default to: "C:\Program Files\Common Files\Autodesk
Shared\Civil Engineering 100".
In addition, interop DLLs are no longer registered as Primary Interop Assemblies
(PIAs), and are deployed in the AutoCAD Civil 3D installation directory rather
than the Global Assembly Cache (GAC). This means that these assemblies
must now be added to Visual Studio projects using the Browse tab of the Add
Reference dialog, rather than from the COM tab as was done previously.
To compile previously written projects against AutoCAD Civil 3D 2013, you
will need to remove references to all interop assemblies from your project,
and then re-add them using the Browse tab.
The assemblies required for COM interop are:
■ Autodesk.AEC.Interop.Base
■ Autodesk.AEC.Interop.UiBase
■ Autodesk.AutoCAD.Interop
■ Autodesk.AutoCAD.Interop.Common
■ Autodesk.AECC.Interop.<domain>
■ Autodesk.AEC.Interop.Ui<domain>
www.EngineeringBooksPdf.com
Where <domain> is one of the four Civil 3D COM domains: Land, Roadway,
Pipe, or Survey.
We recommend that you set the "Embed Interop Types" property for each
interop assembly to True, as this will embed all referenced types into your
target assembly, and the referenced interop DLLs are therefore not required
at runtime.
Also see the for detailed information about these new APIs, and items that
have been deprecated in this release.
Legal Notices
AutoCAD Civil 3D 2013
© 2012 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, Alias (swirl design/logo), AliasStudio, ATC, AUGI, AutoCAD,
AutoCAD Learning Assistance, AutoCAD LT, AutoCAD Simulator, AutoCAD
SQL Extension, AutoCAD SQL Interface, Autodesk, Autodesk Homestyler,
Autodesk Intent, Autodesk Inventor, Autodesk MapGuide, Autodesk Streamline,
AutoLISP, AutoSketch, AutoSnap, AutoTrack, Backburner, Backdraft, Beast,
Beast (design/logo) Built with ObjectARX (design/logo), Burn, Buzzsaw, CAiCE,
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, DesignServer, DesignStudio, Design
Web Format, Discreet, DWF, DWG, DWG (design/logo), DWG Extreme, DWG
TrueConvert, DWG TrueView, DWFX, DXF, Ecotect, Evolver, Exposure,
Extending the Design Team, Face Robot, FBX, Fempro, Fire, Flame, Flare, Flint,
FMDesktop, Freewheel, GDX Driver, Green Building Studio, Heads-up Design,
Heidi, Homestyler, HumanIK, IDEA Server, i-drop, Illuminate Labs AB
(design/logo), ImageModeler, iMOUT, Incinerator, Inferno, Instructables,
Instructables (stylized robot design/logo),Inventor, Inventor LT, Kynapse,
Kynogon, LandXplorer, LiquidLight, LiquidLight (design/logo), Lustre,
www.EngineeringBooksPdf.com
MatchMover, Maya, Mechanical Desktop, Moldflow, Moldflow Plastics
Advisers, Moldflow Plastics Insight, Moldflow Plastics Xpert, Moondust,
MotionBuilder, Movimento, MPA, MPA (design/logo), MPI, MPI (design/logo),
MPX, MPX (design/logo), Mudbox, Multi-Master Editing, Navisworks,
ObjectARX, ObjectDBX, Opticore, Pipeplus, Pixlr, Pixlr-o-matic, PolarSnap,
PortfolioWall, Powered with Autodesk Technology, Productstream,
ProMaterials, RasterDWG, RealDWG, Real-time Roto, Recognize, Render Queue,
Retimer, Reveal, Revit, RiverCAD, Robot, Scaleform, Scaleform GFx, Showcase,
Show Me, ShowMotion, SketchBook, Smoke, Softimage, Softimage|XSI
(design/logo), Sparks, SteeringWheels, Stitcher, Stone, StormNET, Tinkerbox,
ToolClip, Topobase, Toxik, TrustedDWG, U-Vis, ViewCube, Visual, Visual
LISP, Voice Reality, Volo, 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
This chapter describes how to use VBA, and how to set up a new project for
using the COM or .NET APIs for AutoCAD Civil 3D.
To create a new project that uses the AutoCAD Civil 3D managed classes in
Microsoft Visual Studio
1 In Visual Studio 2010, create a new class library solution and project.
Getting Started | 9
www.EngineeringBooksPdf.com
New Project Dialog in Visual Studio
www.EngineeringBooksPdf.com
3 Browse to the install directory for AutoCAD Civil 3D, and select the base
libraries acdbmgd.dll, acmgd.dll, accoremgd.dll, AecBaseMgd.dll, and
AeccDbMgd.dll.
NOTE
These are the base AutoCAD and AutoCAD Civil 3D managed libraries.
Your .NET assembly can use classes defined in additional libraries.
To allow debugging and reduce the disk space requirements for your
projects, select these libraries in the Visual Studio Solution Explorer, and
set the Copy Local property to False.
4 Optionally, you can configure your project to start AutoCAD Civil 3D
when you run the application from Visual Studio, which is useful for
debugging.
NOTE
This option is not avaiable in Express (free) versions of Visual Studio.
using System;
using Autodesk.AutoCAD.Runtime;
namespace GettingStarted
{
public class Class1 : IExtensionApplication
{
Getting Started | 11
www.EngineeringBooksPdf.com
#region IExtensionApplication Members
#endregion
}
}
You can remove or comment out the default content of these methods.
Initialize() is called when your assembly is first loaded by a NETLOAD
command in AutoCAD Civil 3D, and can be used for setting up resources,
reading configuration files, and other initialization tasks. Terminate()
is called when AutoCAD Civil 3D shuts down (there is no NETUNLOAD
command to unload .NET assemblies), and can be used for cleanup to
free resources.
6 You are now ready to create a public method that is the target of a
CommandMethod attribute. This attribute defines the AutoCAD Civil 3D
command that invokes the method. For example:
[CommandMethod("HelloWorld")]
public void HelloWorld()
{
7 Let’s make the method print out a “Hello World” message on the
command line. Add the Autodesk.AutoCAD.ApplicationServices
namespace, and add this line to the HelloWorld() method:
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nHello
World!\n");
www.EngineeringBooksPdf.com
You can now build the assembly and run it. Start AutoCAD Civil 3D,
and type NETLOAD at the command line. In the Choose .NET
Assembly dialog, browse to your assembly DLL (if you are using the
project settings from step 1, this will be GettingStarted.dll). Type
HELLOWORLD at the command line, and you will see the command
output:
}
Open or create a document in AutoCAD Civil 3D that contains
alignments and sites. When you run the HELLOWORLD command
now, you should see output similar to this:
Getting Started | 13
www.EngineeringBooksPdf.com
For more samples, look in the AutoCAD Civil 3D\samples\dotNet directory.
1 CMD - the command name is sent to the command line to execute. This
is the recommended execution type for both .NET and ARX commands.
2 .NET - a method name is located, via Reflection, in the assembly, and is
executed directly. No attribute flags are read and the code is always run
in application context. (A command executed from the command line
runs in the drawing context by default). Therefore, code run as as a .NET
execute type must always be a static method, and must handle its own
document locking.
NOTE
It is safe to explicitly lock a document, even if the code might be run in
document context.
www.EngineeringBooksPdf.com
{
// perform any document / database modifications
here
CivilApplication.ActiveDocument.Settings.DrawingSettings.AmbientSettings.Station.Precision.Value
= 2;
}
}
NOTE
CMD is the recommended execution type in most cases, because you
do not need to explicitly handle document locking. See the discussion
above.
7 For Execute File, browse to the .NET assembly or ARX DLL that contains
the command.
8 For Macro Name, enter:
■ Name of the command to run, if the execute type is CMD
■ Name of the method to run, if the execute type is .NET.
9 Optionally, enter a help file and help topic for the command.
After a command has been set up, it can be run by right-clicking it and clicking
Execute.
Getting Started | 15
www.EngineeringBooksPdf.com
Migrating COM code to .NET
In the majority of cases, the .NET API mirrors the structure of the COM API,
so porting code to .NET involves setting up a .NET project, copying the code
lines, and renaming classes and methods to match the .NET names. If you are
using C# instead of VB.NET, some additional changes to code structure are
required. The following sections describe some of the differences in the two
APIs.
Base Objects
The COM API requires that you access the AcadApplication object (via the
ThisDrawing.Application object), get the interface object for the
AeccApplication object, and from that get the active document. In the .NET
API you import Autodesk.Civil.ApplicationServices namespace, and get
the active document from the CivilApplication class:
g_oDocument = CivilApplication.ActiveDocument()
There is a single root document object, CivilDocument, instead of four
domain-specific root objects for Land, Pipe, Roadway and Survey.
using (Transaction
trans=TransactionManager.StartTransaction())
{
//operation here
trans.Commit();
}
www.EngineeringBooksPdf.com
NOTE
See the section Use Transactions with the Transaction Manager in the AutoCAD
.NET Developer’s Guide for more information about using the Transaction
object to open and modify drawing database objects.
In the .NET API, objects that you get from collections are, in most cases, type
ObjectId, which have to be cast to their intended type using a Transaction
object (returned by TransactionManager.StartTransaction()). Here’s an
example:
m_AligmentStyleId =
m_doc.Styles.AlignmentStyles.Item(sStyleName)
oAlignmentStyle = m_trans.GetObject(m_AligmentStyleId,
OpenMode.ForWrite) As AlignmentStyle
Styles
In the COM API, styles are held by the root document object. In the .NET API,
they are located under CivilDocument.Styles, which is an object of type
StylesRoot and contains style objects inherited from StyleBase. Getting and
setting style attributes for StyleBase objects requires using a
GetDisplayStyle*() method rather than a property. Here’s an example from
COM VBA:
oAlignmentStyle.ArrowDisplayStyle2d.Visible = False
oAlignmentStyle.ArrowDisplayStyle3d.Visible = False
' Display curves using violet.
oAlignmentStyle.CurveDisplayStyle2d.color = 200 ' violet
oAlignmentStyle.CurveDisplayStyle3d.color = 200 ' violet
oAlignmentStyle.CurveDisplayStyle2d.Visible = True
oAlignmentStyle.CurveDisplayStyle3d.Visible = True
This is the equivalent code in VB.NET:
oAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Arrow).Visible
= False
oAlignmentStyle.GetDisplayStylePlan(AlignmentDisplayStyleType.Arrow).Visible
= False
' Display curves using violet.
oAlignmentStyle.GetDisplayStyleModel(AlignmentDisplayStyleType.Curve).Color
Getting Started | 17
www.EngineeringBooksPdf.com
= 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
Settings
In the COM API, settings are accessed through the AeccDatabase::Settings
object, which contains properties representing the settings object hierarchy.
In the .NET API, you use a method to retrieve specific settings objects, for
example:
SettingsPipeNetwork oSettingsPipeNetwork =
doc.Settings.GetFeatureSettings<SettingsPipeNetwork>() as
SettingsPipeNetwork;
Properties
In the COM API, properties are usually simple built-in types, such as double,
or types such as BSTR that map to built-in VBA types such as String. In the
.NET API, most properties are one of the Property* classes that implement
the IProperty interface. For these properties, you get or set the Value of the
property. For example, this code in COM:
oLabelStyleLineComponent.Visibility = True
Becomes this in .NET:
oLabelStyleLineComponent.General.Visible.Value = true;
www.EngineeringBooksPdf.com
NOTE
There are a few other changes here: the Visibility property is renamed
Visible, which has moved to a sub-property of LabelStyleLineComponent
called General.
In addition, there are some areas in implemented functionality that are not
yet complete:
■ Pipes: interference checks (except interference check styles)
■ Corridors:
■ creating new corridors
■ adding baselines to corridors
■ creating or modifying corridor boundaries or masks
■ computing cut and fill
■ setting the CodeSetStyle
If you require this functionality in your .NET project, you can use the
corresponding COM objects.
Getting Started | 19
www.EngineeringBooksPdf.com
■ Autodesk.AEC.Interop.UiBase
■ Autodesk.AutoCAD.Interop
■ Autodesk.AutoCAD.Interop.Common
■ Autodesk.AECC.Interop.<domain>
■ Autodesk.AECC.Interop.Ui<domain>
4 Select the references above, and set the "Copy Local" property to true,
as this will embed all referenced types into your target assembly, and
the referenced interop DLLs are therefore not required at runtime.
5 Add the Autodesk.AutoCAD.Interop and
Autodesk.AECC.Interop.Ui<domain> namespaces to your using or
Imports statement.
NOTE
You may see warnings about types not being found in various
Autodesk.AutoCAD.Interop namespaces (warning type 1684). To disable these
warnings, enter 1684 under Supress Warnings on the Build tab of the project’s
properties.
if (m_oAcadApp != null)
{
m_oAeccApp =
(IAeccApplication)m_oAcadApp.GetInterfaceObject(m_sAeccAppProgId);
m_oAeccDoc =
(IAeccDocument)m_oAeccApp.ActiveDocument;
www.EngineeringBooksPdf.com
// 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 = "";
}
}
For more interoprability examples, see the CSharpClient and VbDotNetClient
sample projects located in <Install directory>\Sample\AutoCAD Civil 3D\COM\.
Root Objects
This section explains how to acquire references to the base objects, which are
required for all applications using the .NET API. It also explains the uses of
the application, document, and database objects and how to use collections,
which are commonly used throughout the .NET API. To help developers who
are already familiar with COM to migrate existing code to .NET, the differences
between the two APIs are highlighted with notes.
www.EngineeringBooksPdf.com
Accessing Application and Document Objects
The root object in the AutoCAD Civil 3D .NET hierarchy is the
CivilApplication object. It contains a reference to the currently active
document, and information about the running product.
NOTE
Unlike the COM API, CivilApplication does not inherit from the AutoCAD
object Autodesk.AutoCAD.ApplicationServices.Application. Therefore, if
you need access to application-level methods and properties (such as the
collection of all open documents, information about the main window, etc.),
you need to access through the AutoCAD Application object. See the
ObjectARX Managed Class Reference in the ObjectARX SDK for information
about this class.
using Autodesk.Civil.ApplicationServices;
namespace CivilSample {
class CivilExample {
CivilDocument doc = CivilApplication.ActiveDocument;
}
}
www.EngineeringBooksPdf.com
NOTE
In the COM API, document objects are contained in collections of objects that
do not need to be cast.
www.EngineeringBooksPdf.com
// to take effect
ts.Commit();
If you attempt to add a new element with properties that match an already
existing element, try to access an item that does not exist, or remove an item
that does not exist or is in use, an error will result. You should trap the error
and respond accordingly.
The following sample demonstrates one method of dealing with such errors:
Settings
This section explains the purpose and use of the document settings objects,
and covers changing general and specific settings.
1 Drawing level: there are drawing-wide settings, such as units and zone,
abbreviations, etc. There are also ambient settings, which affect a variety
www.EngineeringBooksPdf.com
of AutoCAD Civil 3D behaviors. While these settings also apply
drawing-wide, they can be overridden at the feature or command level.
2 Feature (object) level: ambient settings override drawing level ambient
settings for that feature only. There are also feature-specific settings, such
as default styles.
3 Command level: ambient settings can be set on a command-by-command
basis. These settings override both drawing level and feature level settings.
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);
The command settings apply to commands, and correspond to the settings
in the Commands folder for each item in the AutoCAD Civil 3DToolspace
Settings Tab. Each command setting has a corresponding class named
SettingsCmdCommandName. For example, the settings class corresponding to
the CreateAlignmentLayout command is
SettingsCmdCreateAlignmentLayout. As with other types of settings, you use
www.EngineeringBooksPdf.com
the CivilDocument.Settings.GetSettings() method to access command
settings objects in the document.
The following snippet determines what the “Alignment Type Option” is for
the CreateAlignmentLayout command:
SettingsCmdCreateAlignmentLayout alignLayoutCmdSettings =
doc.Settings.GetSettings<SettingsCmdCreateAlignmentLayout>();
www.EngineeringBooksPdf.com
Getting command settings
Label Styles
This section explains common features of label styles. It covers creating a new
label style object, defining a label style, and using property fields in label style
text strings. Details specific to each construct are covered in the appropriate
chapters.
■ Line
■ Block - symbols
■ ReferenceText
■ DirectionArrow
www.EngineeringBooksPdf.com
■ TextForEach
Not all of these may be valid, depending on the label style type. For example,
adding a tick mark component to a label style meant for a point has no visible
effect. Label styles also depend on graphical objects that may or may not be
part of the current document. For example, if the style references a block that
is not part of the current document, then the specified block or tick
components are not shown.
To add a feature to a label style, add a new component to the corresponding
collection using the LabelStyle::AddComponent() method. Then set the
properties of that component to the appropriate values. Always make sure to
set the Visible property to 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:
www.EngineeringBooksPdf.com
{0}\n", e.Message);
}
When first created, the label style object is set according to the ambient
settings. Because of this, a new label style object may already contain features.
If you are creating a new label style object, be sure to check for such existing
features or your style might contain unintended elements.
www.EngineeringBooksPdf.com
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)]>";
Valid property fields for each element are listed in the appropriate chapter.
NOTE
You can also export collections of styles to another drawing by using the static
StyleBase::ExportTo() method.
When exporting styles, you specify how conflicts are resolved using the
StyleConflictResolverType enum. In this example, the first style in the
MajorStationLabelStyles collection is exported from the active drawing to
another open drawing named 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 =
www.EngineeringBooksPdf.com
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
In certain situations attempts to abort the transaction will fail when calling
ExportTo(). This is the case when all the following conditions are all true:
multiple styles are being exported, there is a naming conflict between styles,
and the StyleConflictResolverType is StyleConflictResolverType.Override.
Sample Programs
BatchEditLabelTextSample
<installation-directory>\Sample\Civil 3D
API\DotNet\CSharp\BatchEditLabelTextSample\
This sample prompts the user to select multiple alignment labels, then it
prompts for some input text, and replaces the original text for all selected
labels.
CommandSettingsSample
<installation-directory>\Sample\Civil 3D
API\DotNet\CSharp\CommandSettingsSample\
This sample demonstrates how to iterate through all the command settings
defined in a drawing using Reflection. All commands are exported to an xml
file.
CompareStyles
<installation-directory>\Sample\Civil 3D
API\DotNet\CSharp\CompareStyles\
www.EngineeringBooksPdf.com
This sample illustrates how to compare styles defined in two drawings.
DraggedLabelSample
<installation-directory>\Sample\Civil 3D
API\DotNet\CSharp\DraggedLabelSample\
This sample illustrates how to add a new label in a dragged state.
EditLabelStyleSample
<installation-directory>\Sample\Civil 3D
API\DotNet\CSharp\EditLabelStyleSample\
This sample illustrates how to batch copy label styles from one label to multiple
selected labels.
Surfaces
This chapter covers Civil 3D Surface objects, and how to work with them using
the AutoCAD Civil 3D .NET API.
There are four classes of surface in Civil 3D:
■ TinSurface
■ GridSurface
■ TinVolumeSurface
■ GridVolumeSurface
The first two represent a single layer of terrain, while the second two represent
a volume between two layers. All four derive from a generic Surface object,
which exposes the common methods and properties shared by all surfaces.
Accessing Surfaces
There are many ways to access the surfaces objects in a drawing. All the surfaces
contained by a Document can be obtained using the
CivilDocument.GetSurfaceIds() method, which returns an
ObjectIdCollection.
www.EngineeringBooksPdf.com
{
CivSurface oSurface =
surfaceId.GetObject(OpenMode.ForRead) as CivSurface;
editor.WriteMessage("Surface: {0} \n Type: {1}",
oSurface.Name, oSurface.GetType().ToString());
}
Note that there is also a Surface class in the
Autodesk.AutoCAD.DatabaseServices namespace, which will conflict with
Autodesk.Civil.DatabaseServices.Surface if you use both namespaces. In
this case you can fully qualify the Surface object, or use a "using" alias directive
to disambiguate the reference. For example:
using CivSuface = Autodesk.Civil.DatabaseServices.Surface;
And then use the alias like this:
CivSuface oSurface = surfaceId.GetObject(OpenMode.ForRead)
as CivSuface;
You can also prompt a user to select a specific surface type, such as a TIN
Surface, and then get the surface ID from the selection:
private ObjectId promptForTinSurface(String prompt)
{
PromptEntityOptions options = new PromptEntityOptions(
if (result.Status == PromptStatus.OK)
{
// We have the correct object type
return result.ObjectId;
}
return ObjectId.Null; // Indicating error.
}
Surfaces | 33
www.EngineeringBooksPdf.com
Surface Properties
The Surface object exposes general surface properties, which you can access
using the various GetGeneralProperties() methods. Calculating and returning
properties is a resource-intensive process, so you are encouraged to call this
method once and re-use the returned object, instead of calling the method
for each property. TIN and Grid surfaces have type-specific properties (returned
by GetTinProperties() and GetGridProperties() respectively). Both Tin and
Grid surfaces also implement a GetTerrainProperties() method.
This example gets general properties for the first surface in the database, and
then depending on the surface type, it gets the Tin or Grid surface properties:
[CommandMethod("SurfaceProperties")]
public void SurfaceProperties()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
try
{
// Get the first surface in a document
// "doc" is the CivilApplication.ActiveDocument
www.EngineeringBooksPdf.com
propsMsg += "\nMax Y: " +
genProps.MaximumCoordinateY;
propsMsg += "\nMax Z: " +
genProps.MaximumElevation;
propsMsg += "\nMean Elevation: " +
genProps.MeanElevation;
propsMsg += "\nNumber of Points: " +
genProps.NumberOfPoints;
propsMsg += "\n--";
editor.WriteMessage(propsMsg);
if (oSurface is TinSurface)
{
TinSurfaceProperties tinProps =
((TinSurface)oSurface).GetTinProperties();
propsMsg = "\nTIN Surface Properties for
" + oSurface.Name;
propsMsg += "\n-------------------";
propsMsg += "\nMin Triangle Area: " +
tinProps.MinimumTriangleArea;
propsMsg += "\nMin Triangle Length: " +
tinProps.MinimumTriangleLength;
propsMsg += "\nMax Triangle Area: " +
tinProps.MaximumTriangleArea;
propsMsg += "\nMax Triangle Length: " +
tinProps.MaximumTriangleLength;
propsMsg += "\nNumber of Triangles: " +
tinProps.NumberOfTriangles;
propsMsg += "\n--";
editor.WriteMessage(propsMsg);
}
else if (oSurface is GridSurface)
{
#region GetGridProperties
GridSurfaceProperties gridProps =
((GridSurface)oSurface).GetGridProperties();
propsMsg = "\\Grid Surface Properties for
" + oSurface.Name;
Surfaces | 35
www.EngineeringBooksPdf.com
propsMsg += "\n-------------------";
propsMsg += "\n X Spacing: " +
gridProps.SpacingX;
propsMsg += "\n Y Spacing: " +
gridProps.SpacingY;
propsMsg += "\n Orientation: " +
gridProps.Orientation;
propsMsg += "\n--";
editor.WriteMessage(propsMsg);
#endregion
}
}
catch (System.Exception e) {
editor.WriteMessage(e.Message); }
}
}
Creating Surfaces
GridSurface and TinSurface objects can be created from an imported file, or
created as a new, empty surface to which surface data can be added later. A
new TinSurface can also be created by cropping existing TinSurface objects.
NOTE Import from LandXML data is not supported in the .NET API at this time.
You can use the COM API to import or export surface data to or from LandXML.
Most methods for creating empty or importing surfaces are similar in that
they all have two overloads: one that specifies the database where the surface
will be created (with the default SurfaceStyle applied), the other specifies a
SurfaceStyle to apply, and adds the surface to the database that contains the
SurfaceStyle.
Volume surfaces are created from two existing surfaces, the base (bottom)
surface and a comparison surface.
www.EngineeringBooksPdf.com
database for the drawing to which the TIN surface will be added, and the path
to a .tin file, as a string.
[CommandMethod("CreateFromTIN")]
public void CreateFromTin()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Example TIN surface from Civil Tutorials:
string tinFile = @"C:\Program Files\Autodesk\AutoCAD
Civil 3D 2013\Help\Civil Tutorials\Corridor surface.tin";
try
{
Database db =
Application.DocumentManager.MdiActiveDocument.Database;
ObjectId tinSurfaceId =
TinSurface.CreateFromTin(db, tinFile);
editor.WriteMessage("Import succeeded: {0} \n
{1}", tinSurfaceId.ToString(), db.Filename);
}
catch (System.Exception e)
{
// handle bad file path
editor.WriteMessage("Import failed: {0}",
e.Message);
}
You can create an empty TIN surface and add it to the document’s surface
collection with the TinSurface.Create() method. This method has two
overloads, one that specifies the SurfaceStyle to apply, while the other uses
the default style.
Surfaces | 37
www.EngineeringBooksPdf.com
In this example, we create a new TIN surface with a specified style, and then
add some random point data.
[CommandMethod("CreateTINSurface")]
public void CreateTINSurface()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
string surfaceName = "ExampleTINSurface";
// Select a style to use
ObjectId surfaceStyleId =
doc.Styles.SurfaceStyles[3];
TinSurface surface =
surfaceId.GetObject(OpenMode.ForWrite) as TinSurface;
surface.AddVertices(points);
www.EngineeringBooksPdf.com
Creating a Grid Surface from a DEM File
You can create a GridSurface from a Digital Elevation Model (DEM) file using
the GridSurface.CreateFromDEM() method. There are two overloads of this
method: one that applies the default style, while the other allows you to
specify the SurfaceStyle to use. Both take the filename and path of a DEM
file, as a string.
[CommandMethod("CreateFromDEM")]
public void CreateFromDEM()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Prompt user for a DEM file:
// string demFile = @"C:\Program
Files\Autodesk\AutoCAD Civil 3D 2013\Help\Civil
Tutorials\Corridor surface.tin";
PromptFileNameResult demResult =
editor.GetFileNameForOpen("Enter the path and name of the
DEM file to import:");
editor.WriteMessage("Importing: {0}",
demResult.StringResult);
try
{
// surface style #3 is "slope banding" in the
default template
ObjectId surfaceStyleId =
doc.Styles.SurfaceStyles[3];
ObjectId gridSurfaceId =
GridSurface.CreateFromDEM(demResult.StringResult,
surfaceStyleId);
editor.WriteMessage("Import succeeded: {0} \n",
gridSurfaceId.ToString());
}
catch (System.Exception e)
{
// handle bad file data or other errors
editor.WriteMessage("Import failed: {0}",
e.Message);
}
Surfaces | 39
www.EngineeringBooksPdf.com
// commit the transaction
ts.Commit();
}
}
{
string surfaceName = "ExGridSurface";
// Select a surface style to use
ObjectId surfaceStyleId =
doc.Styles.SurfaceStyles["Slope Banding (2D)"];
www.EngineeringBooksPdf.com
// Add some random elevations
Random m_Generator = new Random();
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
double z = m_Generator.NextDouble() * 10;
GridLocation loc = new GridLocation(i, j);
surface.AddPoint(loc, z);
}
}
In this example, the user is prompted to select the base and comparison
surfaces, and then a new TinVolumeSurface is created from them. The
implementation of promptForTinSurface() is left out for clarity.
CommandMethod("CreateTinVolumeSurface")]
public void CreateTinVolumeSurface()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
string surfaceName = "ExampleVolumeSurface";
// Prompt user to select surfaces to use
// promptForTinSurface uses Editor.GetEntity() to
select a TIN surface
ObjectId baseId = promptForTinSurface("Select the
base surface");
ObjectId comparisonId = promptForTinSurface("Select
the comparison surface");
Surfaces | 41
www.EngineeringBooksPdf.com
try
{
// Create the surface
ObjectId surfaceId =
TinVolumeSurface.Create(surfaceName, baseId, comparisonId);
TinVolumeSurface surface =
surfaceId.GetObject(OpenMode.ForWrite) as TinVolumeSurface;
catch (System.Exception e)
{
editor.WriteMessage("Surface create failed:
{0}", e.Message);
}
Adding a Boundary
A boundary is a closed polygon that affects the visibility of the triangles inside
it.
All boundaries applied to a surface are stored in the
Surface.BoundariesDefinition collection. The boundary itself is defined by
an AutoCAD entity such as a closed polyline or polygon. The height of the
entity plays no part in how surface triangles are clipped, so you can use 2D
or 3D entities. This entity can also contain curves, but the boundary always
consists of lines. How these lines are tessellated is defined by the mid-ordinate
www.EngineeringBooksPdf.com
distance, which is the maximum distance between a curve and the lines that
are generated to approximate it.
You can add boundaries to a surface with its
BoundariesDefinition.AddBoundaries() method. There are three overloads
of this method that take one of these to define the new boundaries:
This method also specifies the boundary type (data clip, outer, hide, or show),
whether non-destructive breaklines should be used, and the mid-ordinate
distance value, which determines how lines are tessellated from curves.
In this example, the user is prompted to select a TIN surface and a polyline,
and the polyline is added to the surface’s boundaries collection. Note that the
surface must be re-built after the boundary is added. The re-build icon in the
Civil 3D GUI is not displayed when a surface’s boundaries are modified using
the .NET API.
[CommandMethod("AddSurfaceBoundary")]
public void AddSurfaceBoundary()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Prompt the user to select a surface and a
polyline
ObjectId surfaceId = promptForEntity("Select the
surface to add a boundary to", typeof(TinSurface));
ObjectId polyId = promptForEntity("Select the object
to use as a boundary", typeof(Polyline));
try
{
Surfaces | 43
www.EngineeringBooksPdf.com
oSurface.BoundariesDefinition.AddBoundaries(new
ObjectIdCollection(boundaries), 100,
Autodesk.Civil.Land.SurfaceBoundaryType.Outer, true);
oSurface.Rebuild();
}
catch (System.Exception e)
{
editor.WriteMessage("Failed to add the boundary:
{0}", e.Message);
}
www.EngineeringBooksPdf.com
NOTE
RebuildSnapshot() will cause an error if the snapshot does not exist.
CreateSnapshot() and RebuildSnapshot() can also cause errors if the surface
is out-of-date. You can check whether the Surface has a snapshot already with
the Surface.HasSnapshot property. For example:
if (oSurface.HasSnapshot)
{
oSurface.RemoveSnapshot();
}
oSurface.CreateSnapshot();
oSurface.RebuildSnapshot();
Extracting Contours
Surfaces | 45
www.EngineeringBooksPdf.com
The method PointFilesDefinition.AddPointFile() takes the path to a point
file, and the ObjectId of a PointFileFormat object. This object is obtained
from the Database’s PointFileFormatCollection using the same string used
to describe the format in the Civil 3D GUI:
www.EngineeringBooksPdf.com
This is an example of adding a PENZD format point file to an existing surface.
The file in this example is from the Civil 3D tutorials directory.
[CommandMethod("SurfacePointFile")]
public void SurfacePointFile()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Select the first Surface in the document
ObjectId surfaceId = doc.GetSurfaceIds()[0];
TinSurface oSurface =
surfaceId.GetObject(OpenMode.ForRead) as TinSurface;
try
{
// add points from a point file to the surface
oSurface.PointFilesDefinition.AddPointFile(penzdFile,
ptFormatId);
}
catch (System.Exception e)
{
editor.WriteMessage("Failed: {0}", e.Message);
Surfaces | 47
www.EngineeringBooksPdf.com
// commit the transaction
ts.Commit();
}
}
www.EngineeringBooksPdf.com
3 If you are using the Kriging method, you need to also create a
KrigingMethodOptions object to set the options for this method:
{
try
{
// Select a TIN Surface:
ObjectId surfaceId = promptForEntity("Select
a TIN surface to smooth\n", typeof(TinSurface));
TinSurface oSurface =
surfaceId.GetObject(OpenMode.ForWrite) as TinSurface;
Surfaces | 49
www.EngineeringBooksPdf.com
points:
int count = polyline.NumberOfVertices;
for (int i = 0; i < count; i++)
{
points.Add(polyline.GetPoint3dAt(i));
}
SurfaceOperationSmooth op =
oSurface.SmoothSurfaceByNNI(output);
www.EngineeringBooksPdf.com
breaklines), and each method has three versions, depending on the type of
object you are creating a breakline from. You can add breaklines from a
Point2dCollection, a Point3dCollection, or an ObjectIdCollection that
contains one or more 3D lines, grading feature lines, splines, or 3D polylines.
Each type of breakline requires a specified mid-ordinate distance parameter,
which determines how curves are tessellated.
A standard breakline consists of an array of 3D lines or polylines. Each
line endpoint becomes a point in the surface and surface triangles around the
breakline are redone. The AddStandardBreaklines() method requires that
you specify the maximum distance, weeding distance and weeding angle, in
addition to the mid-ordinate distance. The maximumDistance parameter
corresponds to the Supplementing Distance in the AutoCAD Civil 3D GUI,
while weedingDistance and weedingAngle correspond to the weeding distance
and angle, respectively.
A proximity breakline does not add new points to a surface. Instead, the
nearest surface point to each breakline endpoint is used. The triangles that
make up a surface are then recomputed making sure those points are
connected.
A non-destructive breakline does not remove any triangle edges. It places
new points along the breakline at each intersection with a triangle edge and
new triangles are computed.
This example illustrates how to add standard, non-destructive and proximity
breaklines:
[CommandMethod("SurfaceBreaklines")]
public void SurfaceBreaklines()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Prompt the user to select a TIN surface and a
polyline, and create a breakline from the polyline
Surfaces | 51
www.EngineeringBooksPdf.com
PromptKeywordOptions pKeyOpts = new
PromptKeywordOptions("");
pKeyOpts.Message = "\nEnter the type of breakline
to create: ";
pKeyOpts.Keywords.Add("Standard");
pKeyOpts.Keywords.Add("Non-Destructive");
pKeyOpts.Keywords.Add("Proximity");
pKeyOpts.Keywords.Default = "Standard";
pKeyOpts.AllowNone = true;
PromptResult pKeyRes = editor.GetKeywords(pKeyOpts);
try
{
switch (pKeyRes.StringResult)
{
case "Non-Destructive":
oSurface.BreaklinesDefinition.AddNonDestructiveBreaklines(new
ObjectIdCollection(lines), 1);
break;
case "Proximity":
oSurface.BreaklinesDefinition.AddProximityBreaklines(new
ObjectIdCollection(lines), 1);
break;
case "Standard":
default:
oSurface.BreaklinesDefinition.AddStandardBreaklines(new
ObjectIdCollection(lines), 10, 5, 5, 0);
break;
}
}
catch (System.Exception e)
{
editor.WriteMessage("Operation failed: {0}",
e.Message);
}
www.EngineeringBooksPdf.com
}
}
{
// Prompt the user to select a TIN surface and a
polyline, and create a breakline from the polyline
Surfaces | 53
www.EngineeringBooksPdf.com
TinSurface oSurface =
surfaceId.GetObject(OpenMode.ForWrite) as TinSurface;
string breaklines = "eg1.flt";
oSurface.BreaklinesDefinition.ImportBreaklinesFromFile(breaklines);
www.EngineeringBooksPdf.com
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Prompt the user to select a TIN surface and a
polyline, and create a contour from the polyline
ObjectId surfaceId = promptForEntity("Select a TIN
surface to add a contour to", typeof(TinSurface));
ObjectId polyId = promptForEntity("Select a polyline
to create a contour from", typeof(Polyline));
TinSurface oSurface =
surfaceId.GetObject(OpenMode.ForWrite) as TinSurface;
oSurface.ContoursDefinition.AddContours(new
ObjectIdCollection(contours), 1, 85.5, 55.5, 0);
Extracting Contours
Contours can be extracted as AutoCAD drawing objects from surfaces (both
TIN and Grid) using versions of ExtractContours(), ExtractContoursAt(),
ExtractMajorContours(), and ExtractMinorContours(). These methods are
defined by the ITerrainSurface interface, and implemented by all Surface
classes.
The four methods are very similar, but accomplish different things:
■ ExtracContours() - this method extracts contours at a specified elevation
interval, starting at the surface's lowest elevation.
■ ExtractContoursAt() - this method extracts all contours at a single
specified elevation.
■ ExtractMajorContours() - this method extracts only major contours from
a Surface.
■ ExtractMinorContours() - this method extracts only minor contours from
a Surface.
Surfaces | 55
www.EngineeringBooksPdf.com
The ExtractContours() method has four versions, the simplest taking an
interval parameter, and another taking an elevation range and interval. There
are also versions of these two methods that take additional smoothing
parameters to smooth the extracted polylines. The extracted contours are
lightweight AutoCAD Polyline objects, and the method returns an
ObjectIdCollection containing the IDs of all extracted objects. The objects are
independent of the surface and can be manipulated without affecting the
underlying surface.
This example creates a random surface, and then extracts contours in a couple
of ways.
// Setup: creates a new, random surface
//
TinSurface surface = CreateRandomSurface("Example Surface");
www.EngineeringBooksPdf.com
}
totalVertices, totalVerticesSmoothed));
Surface Styles
This section describes how to create and apply styles to surface objects.
Surfaces | 57
www.EngineeringBooksPdf.com
Assigning a Style to a Surface
To assign a style to a surface, set the Surface object’s StyleId property to the
ObjectId of a valid SurfaceStyle object.
This example illustrates creating a new style, changing its settings, and then
assigning it to the first surface in the document. Only the plan display settings
are changed for brevity, though you would normally also change the model
display settings as well.
[CommandMethod("SurfaceStyle")]
public void SurfaceStyle()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// create a new style called 'example style':
ObjectId styleId =
doc.Styles.SurfaceStyles.Add("example style");
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.Triangles).Visible
= true;
surfaceStyle.GetDisplayStyleModel(SurfaceDisplayStyleType.Triangles).Visible
= true;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.Boundary).Visible
= true;
surfaceStyle.BoundaryStyle.DisplayExteriorBoundaries
= true;
surfaceStyle.BoundaryStyle.DisplayInteriorBoundaries
= false;
www.EngineeringBooksPdf.com
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.MajorContour).Visible
= true;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.MinorContour).Visible
= false;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.UserContours).Visible
= false;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.Directions).Visible
= false;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.Elevations).Visible
= false;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.Slopes).Visible
= false;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.SlopeArrows).Visible
= false;
surfaceStyle.GetDisplayStylePlan(SurfaceDisplayStyleType.Watersheds).Visible
= false;
Surfaces | 59
www.EngineeringBooksPdf.com
Surface Analysis
This section shows you how to access surface analysis data using the .NET
API.
All surface analysis data is accessed with the Surface.Analysis property,
which exposes data for contour, user-defined contour, direction, elevation,
slope arrow, slope, and watershed analyses.
The .NET API does not have an equivalent to the COM API
SurfaceAnalysisElevation.CalculateElevationRegions() method, but you
can implement one that does the same thing. This example shows one
implementation, and the implemented method being used by a command:
/// <summary>
/// Calculates elevation regions for a given surface, and
returns an array that can be passed
/// to Surface.Analysis.SetElevationData()
/// </summary>
/// <param name="surface">A Civil 3D Surface object</param>
/// <param name="steps">The number of elevation steps to
calculate</param>
/// <param name="startColor">The index of the start color.
Each subsequent color index is incremeted by 2.</param>
/// <returns>An array of SurfaceAnalysisElevationData
objects.</returns>
private SurfaceAnalysisElevationData[]
CalculateElevationRegions(Autodesk.Civil.Land.DatabaseServices.Surface
www.EngineeringBooksPdf.com
surface, int steps, short startColor)
{
// calculate increments based on # of steps:
double minEle =
surface.GetGeneralProperties().MinimumElevation;
double maxEle =
surface.GetGeneralProperties().MaximumElevation;
double incr = (maxEle - minEle) / steps;
return newData;
}
/// <summary>
/// Illustrates performing an elevation analysis
/// </summary>
[CommandMethod("SurfaceAnalysis")]
public void SurfaceAnalysis()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Select first TIN Surface
ObjectId surfaceId = doc.GetSurfaceIds()[0];
TinSurface oSurface =
surfaceId.GetObject(OpenMode.ForWrite) as TinSurface;
Surfaces | 61
www.EngineeringBooksPdf.com
SurfaceAnalysisElevationData[] newData =
CalculateElevationRegions(oSurface, 10, 100);
oSurface.Analysis.SetElevationData(newData);
The .NET API does not implement an equivalent to the COM API
AeccSurfaceAnalysisWatershed.CalculateWatersheds() method, but you
can use the SurfaceAnalysis.GetWatershedData() method to access watershed
data from an existing analysis, and change properties (such as AreaColor) of
watershed regions.
Each item in the SurfaceAnalysisWatershedDataCollection represents a
watershed region. Depending on the nature of the drain target, each watershed
region is a different type specified by the WatershedType enumeration. (For
more information about watershed region types, see “Types of Watersheds”
in the ). Other properties, such as the region color, hatch pattern, description,
and visibility, are all accessible.
This example illustrates reading the properties of an existing watershed
analysis:
[CommandMethod("SurfaceWatershedAnalysis")]
public void SurfaceWatershedAnalysis()
{
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
www.EngineeringBooksPdf.com
{
// Select first TIN Surface
ObjectId surfaceId = doc.GetSurfaceIds()[0];
CivSurface oSurface =
surfaceId.GetObject(OpenMode.ForRead) as CivSurface;
SurfaceAnalysisWatershedDataCollection analysisData
= oSurface.Analysis.GetWatershedData();
editor.WriteMessage("Number of watershed regions:
{0}\n", analysisData.Count);
foreach (SurfaceAnalysisWatershedData watershedData
in analysisData)
{
editor.WriteMessage("Data item AreaId: {0} \n"
+ "Description: {1}\n"
+ "Type: {2}\n"
+ "Drains into areas: {3}\n"
+ "Visible? {4}\n",
watershedData.AreaID,
watershedData.Description, watershedData.Type,
String.Join(", ", watershedData.DrainsInto),
watershedData.Visible);
}
Surfaces | 63
www.EngineeringBooksPdf.com
In this example, a sample TIN surface is created, a polygon inside the surface
is defined, and both versions of the GetBoundedVolumes() method is called
on the surface.
// Create a sample surface
ObjectId surfaceId = TinSurface.Create(_acaddoc.Database,
"Example Surface");
TinSurface surface = surfaceId.GetObject(OpenMode.ForWrite)
as TinSurface;
SurfaceVolumeInfo surfaceVolumeInfo =
surface.GetBoundedVolumes(polygon, elevation);
write(String.Format("Surface volume info:\n Cut volume:
{0}\n Fill volume: {1}\n Net volume: {2}\n",
surfaceVolumeInfo.Cut, surfaceVolumeInfo.Fill,
surfaceVolumeInfo.Net));
www.EngineeringBooksPdf.com
Alignments
This chapter covers creating and using Alignments, Stations, and Alignment
styles using the AutoCAD Civil 3D .NET API.
Creating an Alignment
Alignments are usually created without being associated with an existing site.
Each CivilDocument object has its own collection of alignments not associated
with a site accessed with the GetSitelessAlignmentIds() method. There is
also a collection of all alignments (siteless and associated with a site) accessed
with GetAlignmentIds() method. Alignments can be moved into a site with
the Alignment.CopyToSite() method. A siteless alignment can be copied from
a sited alignment using Alignment.CopyToSite(), and passing ObjectId.Null
or ““ as the site.
The Alignment class provides versions of the Create() method to create a new
Alignment object from a polyline, or without geometry data. There are two
overloads for creating an alignment without geometry data. Both take a
reference to the document object, and the name of the new alignment. One
takes ObjectIds for the site to associate the alignment with (pass ObjectId.Null
to create a siteless alignment), the layer to create the alignment on, the style
to apply to the alignment, and the label set style to use. The other overload
takes strings naming these items. Here’s a simple example that creates a siteless
alignment without geometry data:
Alignments | 65
www.EngineeringBooksPdf.com
There are two overloads of the create() method for creating alignments from
polylines. The first takes a reference to the CivilDocument object, a
PolylineOptions object (which contains the ID of the polyline to create an
alignment from), a name for the new alignment, the ObjectID of a layer to
draw to, the ObjectID of an alignment style, and the ObjectID of a label set
object, and returns the OjectID of the new Alignment. The second overload
takes the same parameters, except the layer, alignment style, and label set are
specified by name instead of ObjectID.
This code creates an alignment from a 2D polyline, using existing styles:
[CommandMethod("CreateAlignment")]
public void CreateAlignment()
{
doc = CivilApplication.ActiveDocument;
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
www.EngineeringBooksPdf.com
Creating an Alignment Offset From Another Alignment
[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;
Alignments | 67
www.EngineeringBooksPdf.com
AlignmentEntityCollection object. This collection has a wide array of methods
for creating new entities.
Here’s a short code snippet that illustrates one of the methods for adding a
FixedCurve entitiy to an alignment’s Entities collection:
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);
[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.");
www.EngineeringBooksPdf.com
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);
}
}
}
Each entity has an identification number contained in its
AlignmentEntity.EntityId property. Each entity knows the numbers of the
entities before and after it in the alignment, and you can access specific entities
Alignments | 69
www.EngineeringBooksPdf.com
by identification number through the
AlignmentEntityCollection.EntityAtId() method.
Stations
StationEquation myStationEquation =
myAlignment.StationEquations.Add(80, 0,
StationEquationType.Increasing);
NOTE
Some functions, such as
Alignment::DesignSpeedCollection::GetDesignSpeed(), require a “raw”
station value without regard to modifications made by station equations.
www.EngineeringBooksPdf.com
// 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){
Alignments | 71
www.EngineeringBooksPdf.com
Finding the Location of a Station
You can find the point coordinates (northing and easting) of a station and
offset on an alignment using the Alignment::PointLocation() method. The
simplest version of the method takes a station and offset, and returns a
northing and easting (as ref parameters).
Another version of this method takes a station, offset, and tolerance, and
returns a northing, easting, and bearing (as ref parameters). The tolerance
determines on which alignment entity the point is returned. If the tolerance
is greater than the desired station minus the station at the alignment entity
transition, the point will be reported on that entity. For example, consider an
alignment made up of a tangent (length 240) and curve (length 260). Looking
for the location of station 400, with tolerance = 0, will find a point on the
curve. However, a tolerance of 200 will cause the method to report a point on
the tangent, because 400 - 240 < 200.
Superelevation
Another setting that can be applied to certain stations of an alignment is the
superelevation, used to adjust the angle of roadway section components for
corridors based on the alignment. The inside and outside shoulders and road
surfaces can be adjusted for both the left and right sides of the road.
NOTE
The Superelevation feature was substantially changed in AutoCAD Civil 3D
2013, and the API has also changed. The Alignment::SuperelevationData
property and Alignment::SuperElevationAtStation() method have been
removed. Existing code should be updated to use the new API, and access
superelevation via Alignment::SuperelevationCurves,
Alignment::SuperelevationCriticalStations, and
SuperelevationCriticalStationCollection::GetCriticalStationAt().
The superelevation data for an alignment is divided into discrete curves, called
superelevation curves, and each superelevation curve contains transition
regions where superelevation transitions from normal roadway to full
superelevation and back (with separate regions for transition in, and transition
out of superelvation). These regions are defined by “critical stations”, or
stations where there is a transition in the roadway cross-section. The collection
of superelevation curves for an alignment is accessed with the
Alignment::SuperelevationCurves property, while all critical stations for all
www.EngineeringBooksPdf.com
curves is accessed with the Alignment::SuperelevationCriticalStations
property. The SuperelevationCurves collection is empty if superelevation
curves have not been added to the alignment (either manually, or calculated
by the Superelevation Wizard in the user interface). The
SuperelevationCriticalStations collection contains default entites for the
start and end stations of the Alignment if no superelevation data has been
calculated for the curves.
An individual SuperelevationCriticalStation can be accessed through the
Alignment::SuperelevationCriticalStations::GetCriticalStationAt()
method.
In this code snippet, the collection of superelevation curves for an alignment
is iterated, and information about each critical station in each curve is printed
out. Note that you must specify the cross segment type to get either the slope
or smoothing length, but you may not know which segment types are valid
for the critical station. In this snippet, the code attempts to get all segment
types, and silently catches the InvalidOperationException exception for
invalid types.
[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",
Alignments | 73
www.EngineeringBooksPdf.com
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) {
}
}
}
}
}
}
Alignment Style
www.EngineeringBooksPdf.com
created, but it can also be assigned to an existing alignment through the
Alignment.StyleId property.
[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();
Alignments | 75
www.EngineeringBooksPdf.com
}
}
www.EngineeringBooksPdf.com
method. The following list of property fields indicates valid values for the
Text component:
<[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)]>
Label styles for minor stations, geometry points, design speeds, and station
equations can also use the following property fields:
Alignments | 77
www.EngineeringBooksPdf.com
<[Geometry Point Entity After Data(CP)]> Geometry points
Label styles are described in detail in the chapter 2 section Label Styles (page
27).
Sample Programs
AlignmentSample
<installation-directory>\Sample\Civil 3D
API\DotNet\VB.NET\AlignmentSample
Some of the sample code from this chapter can be found in context in the
AlignmentSample project. This sample shows how to create an alignment,
add entities to an alignment, create an alignment label style set, get a site,
and create an alignment style.
Sprial2 Demo
<installation-directory>\Sample\Civil 3D
API\DotNet\CSharp\Spiral2 Demo
Demonstrates how to get simple and complex alignment information.
Profiles
This chapter describes the process for creating and using profiles with the
AutoCAD Civil 3D .NET API. For information about using Profiles with the
COM API, see Profiles (page 297)
www.EngineeringBooksPdf.com
Profiles
Profiles are the vertical analogue to alignments. Together, an alignment and
a profile represent a 3D path.
Profiles | 79
www.EngineeringBooksPdf.com
doc.Styles.LabelSetStyles.ProfileLabelSetStyles[0];
try
{
ObjectId profileId =
Profile.CreateFromSurface("My Profile", alignID, surfaceId,
layerId, styleId, labelSetId);
ts.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
ed.WriteMessage(e.Message);
}
}
}
[CommandMethod("CreateProfileNoSurface")]
public void CreateProfileNoSurface()
{
doc = CivilApplication.ActiveDocument;
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts =
www.EngineeringBooksPdf.com
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;
Profiles | 81
www.EngineeringBooksPdf.com
oProfile.Entities.AddFreeSymmetricParabolaByLength(oTangent1.EntityId,
oTangent2.EntityId, VerticalCurveType.Sag, 900.1, true);
ts.Commit();
}
[CommandMethod("EditPVI")]
public void EditPVI()
{
doc = CivilApplication.ActiveDocument;
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// get first profile of first alignment in document
ObjectId alignID = doc.GetAlignmentIds()[0];
Alignment oAlignment = ts.GetObject(alignID,
OpenMode.ForRead) as Alignment;
Profile oProfile =
www.EngineeringBooksPdf.com
ts.GetObject(oAlignment.GetProfileIds()[0],
OpenMode.ForRead) as Profile;
ts.Commit();
}
}
Profiles | 83
www.EngineeringBooksPdf.com
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
ObjectId profileStyleId =
doc.Styles.ProfileStyles.Add("New Profile Style");
ProfileStyle oProfileStyle =
ts.GetObject(profileStyleId, OpenMode.ForRead) as
ProfileStyle;
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.Arrow).Visible
= true;
// set to yellow:
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.Line).Color
= Color.FromColorIndex(ColorMethod.ByAci, 50);
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.Line).Visible
= true;
// grey
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.LineExtension).Color
= Color.FromColorIndex(ColorMethod.ByAci, 251);
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.LineExtension).Visible
= true;
// green
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.Curve).Color
= Color.FromColorIndex(ColorMethod.ByAci, 80);
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.Curve).Visible
= true;
// grey
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.ParabolicCurveExtension).Color
= Color.FromColorIndex(ColorMethod.ByAci, 251);
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.ParabolicCurveExtension).Visible
= true;
// green
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.SymmetricalParabola).Color
= Color.FromColorIndex(ColorMethod.ByAci, 81);
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.SymmetricalParabola).Visible
= true;
// green
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.AsymmetricalParabola).Color
= Color.FromColorIndex(ColorMethod.ByAci, 83);
oProfileStyle.GetDisplayStyleProfile(ProfileDisplayStyleProfileType.AsymmetricalParabola).Visible
= true;
www.EngineeringBooksPdf.com
// properties for 3D should also be set
}
}
Profile Views
This section describes the creation and display of profile views. A profile view
is a graph displaying the elevation of a profile along the length of the related
alignment.
[CommandMethod("CreateProfileView")]
public void CreateProfileView()
{
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;
// Create insertion point:
Point3d ptInsert = new Point3d(100, 100, 0);
Profiles | 85
www.EngineeringBooksPdf.com
// Get profile view band set style ID:
ObjectId pfrVBSStyleId =
doc.Styles.ProfileViewBandSetStyles["Standard"];
// If this doesn't exist, get the first style in
the collection
if (pfrVBSStyleId == null) pfrVBSStyleId =
doc.Styles.ProfileViewBandSetStyles[0];
ObjectId ProfileViewId = ProfileView.Create(doc,
"New Profile View", pfrVBSStyleId, alignID, ptInsert);
ts.Commit();
}
}
ObjectId profileViewStyleId =
doc.Styles.ProfileViewStyles.Add("New Profile View Style");
ProfileViewStyle oProfileViewStyle =
ts.GetObject(profileViewStyleId, OpenMode.ForRead) as
ProfileViewStyle;
www.EngineeringBooksPdf.com
Setting the Axis Style
All axis styles are based on the AxisStyle class. The axis style object controls
the display style of the axis itself, tick marks and text placed along the axis,
and a text annotation describing the axis’s purpose. The annotation text,
location, and size is set through the AxisStyle.TitleStyle property, an object
of type AxisTitleStyle. The annotation text can use any of the following
property fields:
Within each axis style are properties for specifying the tick marks placed along
the axis. Both major tick marks and minor tick marks are represented by objects
of type AxisTickStyle. The AxisTickStyle class manages the location, size,
and visual style of tick marks through its Interval, Size and other properties.
Note that while most style properties use drawing units, the Interval property
uses the actual ground units of the surface. The AxisTickStyle object also
determines the text that is displayed at each tick, including the following
property fields:
Profiles | 87
www.EngineeringBooksPdf.com
Valid property fields for TickStyle.Text Axis
Graph Title
<[Parent Alignment(CP)]>
<[Drawing Scale(P4|RN|AP|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for GraphTitleStyle.Text
[CommandMethod("ProfileHatching")]
public void ProfileHatching () {
doc = CivilApplication.ActiveDocument;
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
using ( Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction()
) {
// Ask the user to select a profile view
PromptEntityOptions opt = new
PromptEntityOptions("\nSelect a profile view");
opt.SetRejectMessage("\nObject must be a profile
view.\n");
opt.AddAllowedClass(typeof(ProfileView), false);
Profiles | 89
www.EngineeringBooksPdf.com
ObjectId profileViewID = ed.GetEntity(opt).ObjectId;
ProfileView oProfileView =
ts.GetObject(profileViewID, OpenMode.ForRead) as
ProfileView;
ed.WriteMessage("\nHatch areas defined in this
profile view: \n");
foreach ( ProfileHatchArea oProfileHatchArea in
oProfileView.HatchAreas ) {
ed.WriteMessage(" Hatch area: " +
oProfileHatchArea.Name + " shape style: " +
oProfileHatchArea.ShapeStyleName + "\n");
foreach ( ProfileCriteria oProfileCriteria in
oProfileHatchArea.Criteria ) {
ed.WriteMessage(string.Format(" Criteria:
type: {0} profile: {1}\n",
oProfileCriteria.BoundaryType.ToString(),
oProfileCriteria.ProfileName) );
}
}
}
}
[CommandMethod("ModProfileViewStyle")]
public void ModProfileViewStyle()
{
doc = CivilApplication.ActiveDocument;
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
{
// Get the first style in the document's collection
of styles
ObjectId profileViewStyleId =
www.EngineeringBooksPdf.com
doc.Styles.ProfileViewStyles[0];
ProfileViewStyle oProfileViewStyle =
ts.GetObject(profileViewStyleId, OpenMode.ForRead) as
ProfileViewStyle;
ts.Commit();
}
}
Sample Programs
Profile Sample
Profiles | 91
www.EngineeringBooksPdf.com
Pipe Networks
This chapter describes working with pipe networks with the AutoCAD Civil
3D .NET API.
Base Objects
This section explains how to get the base objects required for using the pipe
network API classes.
www.EngineeringBooksPdf.com
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
SettingsPipeNetwork oSettingsPipeNetwork =
doc.Settings.GetSettings<SettingsPipeNetwork>() as
SettingsPipeNetwork;
ed.WriteMessage("Using pipe rules: {0}\n",
oSettingsPipeNetwork.Rules.Pipe.Value);
// Set the default units used for pipes in this
document.
oSettingsPipeNetwork.Angle.Unit.Value =
Autodesk.Civil.AngleUnitType.Radian;
oSettingsPipeNetwork.Coordinate.Unit.Value =
Autodesk.Civil.LinearUnitType.Foot;
oSettingsPipeNetwork.Distance.Unit.Value =
Autodesk.Civil.LinearUnitType.Foot;
}
Pipe Networks | 93
www.EngineeringBooksPdf.com
{
ed.WriteMessage("Name: {0}, Description: {1}, DataType:
{2}, Value: {3}\n",
oPartDataField.Name,
oPartDataField.Description,
oPartDataField.DataType,
oPartDataField.Value);
}
Dynamic properties created with the NetworkCatalogDef class are not yet
supported by the .NET API.
[CommandMethod("PrintParts")]
public void PrintParts()
{
CivilDocument doc = CivilApplication.ActiveDocument;
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.
Database.TransactionManager.StartTransaction())
{
// SettingsPipeNetwork oSettingsPipeNetwork =
doc.Settings.GetSettings<SettingsPipeNetwork>() as
SettingsPipeNetwork;
PartsListCollection oPartListCollection =
doc.Styles.PartsListSet;
ed.WriteMessage("Number of parts lists in document:
www.EngineeringBooksPdf.com
{0}\n", oPartListCollection.Count);
foreach (ObjectId objId in oPartListCollection)
{
PartsList oPartsList = ts.GetObject(objId,
OpenMode.ForWrite) as PartsList;
ed.WriteMessage("PARTS LIST:
{0}\n----------------\n", oPartsList.Name);
// From the part list, looking at only those
part families
// that are pipes, print all the individual
parts, plus
// some information about each part.
ObjectIdCollection pipeFamilyCollection =
oPartsList.GetPartFamilyIdsByDomain(DomainType.Pipe);
ed.WriteMessage(" Pipes\n =====\n");
foreach (ObjectId objIdPfa in
pipeFamilyCollection)
{
PartFamily oPartFamily =
ts.GetObject(objIdPfa, OpenMode.ForWrite) as PartFamily;
if (oPartFamily.Domain == DomainType.Pipe)
{
ed.WriteMessage(" Family: {0}\n",
oPartFamily.Name);
SizeFilterRecord oSizeFilterRecord =
oPartFamily.PartSizeFilter;
SizeFilterField SweptShape =
oSizeFilterRecord.GetParamByContextAndIndex(PartContextType.SweptShape,
0);
SizeFilterField MinCurveRadius =
oSizeFilterRecord.GetParamByContextAndIndex(PartContextType.MinCurveRadius,
0);
//SizeFilterField
StructPipeWallThickness;
SizeFilterField FlowAnalysisManning =
oSizeFilterRecord.GetParamByContextAndIndex(PartContextType.FlowAnalysisManning,
0);
SizeFilterField m_Material =
oSizeFilterRecord.GetParamByContextAndIndex(PartContextType.Material,
0);
// SizeFilterField PipeInnerDiameter
=
Pipe Networks | 95
www.EngineeringBooksPdf.com
oSizeFilterRecord.GetParamByContextAndIndex(PartContextType.PipeInnerDiameter,
0);
ed.WriteMessage(" {0}: {1}, {2}: {3},
{4}: {5} {6}: {7}\n",
SweptShape.Description,
SweptShape.Value,
MinCurveRadius.Description,
MinCurveRadius.Value,
FlowAnalysisManning.Description,
FlowAnalysisManning.Value,
m_Material.Description,
m_Material.Value
);
}
}
// From the part list, looking at only those
part families
// that are structures, print all the individual
parts.
ed.WriteMessage(" Structures\n =====\n");
foreach (ObjectId objIdPfa in
pipeFamilyCollection)
{
PartFamily oPartFamily =
ts.GetObject(objIdPfa, OpenMode.ForWrite) as PartFamily;
if (oPartFamily.Domain ==
DomainType.Structure)
{
ed.WriteMessage(" Family: {0}\n",
oPartFamily.Name);
}
}
}
}
}
www.EngineeringBooksPdf.com
also contains the method FindShortestNetworkPath() for determining the
path between two network parts.
The Network.ReferenceSurfaceId is used primarily for Pipe Rules. For example,
you can have a rule that places the structure rim at a specified elevation from
the surface.
Pipe Networks | 97
www.EngineeringBooksPdf.com
Dim line As LineSegment3d = New LineSegment3d(New
Point3d(30, 9, 0), New Point3d(33, 7, 0))
Dim oidNewPipe As ObjectId = ObjectId.Null
oNetwork.AddLinePipe(oidPipe, psizePipe, line,
oidNewPipe, True)
Dim oidStructure As ObjectId = oPartsList("CMP
Rectangular End Section SI")
Dim opfStructure As PartFamily =
trans.GetObject(oidStructure, OpenMode.ForWrite)
Dim psizeStructure As ObjectId = opfStructure(0)
Dim startPoint As Point3d = New Point3d(30, 9, 0)
Dim endPoint As Point3d = New Point3d(33, 7, 0)
Dim oidNewStructure As ObjectId = ObjectId.Null
oNetwork.AddStructure(oidStructure, psizeStructure,
startPoint, 0, oidNewStructure, True)
oNetwork.AddStructure(oidStructure, psizeStructure,
endPoint, 0, oidNewStructure, True)
ed.WriteMessage("PipeNetwork created" +
Convert.ToChar(10))
trans.Commit()
CreatePipeNetwork = True
End Function ' CreatePipeNetwork
Pipes
This section explains the creation and use of pipes. Pipes represent the conduits
within a pipe network.
Creating Pipes
Pipe objects represent the conduits of the pipe network. Pipes are created using
the pipe network’s methods for creating either straight or curved pipes,
AddLinePipe() and AddCurvePipe(). Both methods require you to specify a
particular part family (using the ObjectId of a family) and a particular part
size filter object as well as the geometry of the pipe.
This sample creates a straight pipe between two hard-coded points using the
first pipe family and pipe size filter it can find in the part list:
[CommandMethod("AddPipe")]
www.EngineeringBooksPdf.com
public void AddPipe()
{
CivilDocument doc = CivilApplication.ActiveDocument;
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.
Database.TransactionManager.StartTransaction())
{
ObjectIdCollection oIdCollection =
doc.GetPipeNetworkIds();
// Get the first network in the document
ObjectId objId = oIdCollection[0];
Network oNetwork = ts.GetObject(objId,
OpenMode.ForWrite) as Network;
ed.WriteMessage("Pipe Network: {0}\n",
oNetwork.Name);
// Go through the list of part types and select
the first pipe found
ObjectId pid = oNetwork.PartsListId;
PartsList pl = ts.GetObject(pid, OpenMode.ForWrite)
as PartsList;
ObjectId oid = pl["Concrete Pipe"];
PartFamily pfa = ts.GetObject(oid,
OpenMode.ForWrite) as PartFamily;
ObjectId psize = pfa[0];
LineSegment3d line = new LineSegment3d(new
Point3d(30, 9, 0), new Point3d(33, 7, 0));
ObjectIdCollection col = oNetwork.GetPipeIds();
ObjectId oidNewPipe = ObjectId.Null;
oNetwork.AddLinePipe(oid, psize, line, ref
oidNewPipe, false);
Pipe oNewPipe = ts.GetObject(oidNewPipe,
OpenMode.ForRead) as Pipe;
ed.WriteMessage("Pipe created: {0}\n",
oNewPipe.DisplayName);
ts.Commit();
}
Pipe Networks | 99
www.EngineeringBooksPdf.com
Using Pipes
To make a new pipe a meaningful part of a pipe network, it must be connected
to structures or other pipes using the Pipe.ConnectToStructure() or
Pipe.ConnectToPipe() methods, or structures must be connected to it using
the Structure.ConnectToPipe() method. Connecting pipes together directly
creates a new virtual Structure object to serve as the joint. If a pipe end is
connected to a structure, it must be disconnected before attempting to connect
it to a different structure. After a pipe has been connected to a network, you
can determine the structures at either end by using the StartStructureId and
EndStructureId properties. There are methods and properties for setting and
determining the flow direction, getting all types of physical measurements,
and for accessing collections of user-defined properties for custom descriptions
of the pipe.
www.EngineeringBooksPdf.com
As PipeStyle
Dim oPipeStyleId As ObjectId
Dim oPipeStyle As PipeStyle
Dim trans As Transaction = tm.StartTransaction()
Try
oPipeStyleId =
g_oDocument.Styles.PipeStyles.Add(sStyleName)
Catch
End Try
If (oPipeStyleId = ObjectId.Null) Then
Try
oPipeStyleId =
g_oDocument.Styles.PipeStyles.Item(sStyleName)
Catch
End Try
If (oPipeStyleId = ObjectId.Null) Then
MsgBox("Could not create or use a pipe style
with the name:" & sStyleName)
CreatePipeStyle = Nothing
Exit Function
End If
End If
oPipeStyle = trans.GetObject(oPipeStyleId,
OpenMode.ForWrite)
' Set the display size of the pipes in plan view. We
will
' use absolute drawing units for the inside, outside,
and
' ends of each pipe.
' enter a value greater than or equal to 0.000mm and
less than or equal to 1000.000mm
oPipeStyle.PlanOption.InnerDiameter = 0.0021
oPipeStyle.PlanOption.OuterDiameter = 0.0024
' Indicate that we will use our own measurements for
the inside
' and outside of the pipe, and not base drawing on the
actual
' type of pipe.
oPipeStyle.PlanOption.WallSizeType =
PipeWallSizeType.UserDefinedWallSize
' Inidcate what kind of custom sizing to use.
oPipeStyle.PlanOption.WallSizeOptions =
PipeUserDefinedType.UseDrawingScale
www.EngineeringBooksPdf.com
oPipeStyle.PlanOption.EndLineSize = 0.0021
' Indicate that we will use our own measurements for
the end
'line of the pipe, and not base drawing on the actual
type
' of pipe.
oPipeStyle.PlanOption.EndSizeType =
PipeEndSizeType.UserDefinedEndSize
' Inidcate what kind of custom sizing to use.
oPipeStyle.PlanOption.EndSizeOptions =
PipeUserDefinedType.UseDrawingScale
'
' Modify the colors of pipes using this style, as shown
www.EngineeringBooksPdf.com
Creating Pipe Label Styles
The collection of all pipe label styles in a document is found in the
CivilDocument.Styles.PipeLabelStyles property, which is a
LabelStylesPipeRoot object. This object lets you get and set cross section
label styles, plan / profile view label styles, and default label styles for pipes.
NOTE
The label style of a particular pipe cannot be set using the .NET API.
Structures
This section describes the creation and use of structures. Structures are the
connectors within a pipe network.
Creating Structures
Structures represent physical objects such as manholes, catch basins, and
headwalls. Logically, structures are used as connections between pipes at pipe
endpoints. In cases where two pipes connect directly, an Structure object
not representing any physical object is still created to serve as the joint. Any
number of pipes can connect with a structure. Structures are represented by
objects of type Structure, which are created by using the AddStructure()
method of Network.
See the code sample in Creating a Pipe Network (page 96) for an example of
how to call this method.
Using Structures
To make the new structure a meaningful part of a pipe network, it must be
connected to pipes in the network using the Structure.ConnectToPipe()
method or pipes must be connected to it using the Pipe.ConnectToStructure()
method. After a structure has been connected to a network, you can determine
the pipes connected to it by using the ConnectedPipe property, which is a
read-only collection of network parts. There are also methods and properties
for setting and determining all types of physical measurements for the structure
www.EngineeringBooksPdf.com
and for accessing collections of user-defined properties for custom descriptions
of the structure.
www.EngineeringBooksPdf.com
CreateStructureStyle = Nothing
Exit Function
End If
End If
oStructureStyle = trans.GetObject(oStructureStyleId,
OpenMode.ForWrite)
oStructureStyle.GetDisplayStylePlan(StructureDisplayStylePlanType.Structure).Color
= Color.FromRgb(255, 191, 0) ' orange
oStructureStyle.GetDisplayStylePlan(StructureDisplayStylePlanType.Structure).Visible
= True
oStructureStyle.PlanOption.MaskConnectedObjects = False
oStructureStyle.PlanOption.SizeType =
StructureSizeOptionsType.UseDrawingScale
oStructureStyle.PlanOption.Size = 0.0035
oStructureStyle.GetDisplayStyleSection(StructureDisplayStylePlanType.Structure).Visible
= False
oStructureStyle.GetDisplayStyleSection(StructureDisplayStylePlanType.StructureHatch).Visible
= False
oStructureStyle.GetDisplayStylePlan(StructureDisplayStylePlanType.StructureHatch).Visible
= False
oStructureStyle.GetDisplayStyleProfile(StructureDisplayStylePlanType.Structure).Visible
= False
oStructureStyle.GetDisplayStyleProfile(StructureDisplayStylePlanType.StructureHatch).Visible
= False
trans.Commit()
ed.WriteMessage("Create StructureStyle Successful." +
Convert.ToChar(10))
CreateStructureStyle = oStructureStyle
End Function ' CreateStructureStyle
NOTE
The label style of a particular structure cannot be set using the .NET API.
www.EngineeringBooksPdf.com
Interference Checks
This section explains how to generate and examine an interference check. An
interference check is used to determine when pipe network parts are either
intersecting or are too close together.
www.EngineeringBooksPdf.com
corresponding AbsoluteModelSize or DrawingScaleModelSize property to the
desired value. Again, the DisplayStyle object returned by
GetDisplayStyleModel() controls the visual features such as color and line
type.
The third option is to place a symbol at the location of intersection. Set the
GetDisplayStylePlan(InterferenceDisplayStyleType.Symbol).Visible
property to True to make symbols visible. The style property MarkerStyle, an
object of type MarkerStyle, controls all aspects of how the symbol is drawn.
This sample creates a new interference style object that displays an X symbol
with a superimposed circle at points of intersection:
www.EngineeringBooksPdf.com
Color.FromColorIndex(ColorMethod.ByAci, 200);
oMarkerStyle.MarkerDisplayStylePlan.Visible = true;
oMarkerStyle.SizeType =
MarkerSizeType.AbsoluteUnits;
oMarkerStyle.MarkerSize = 5.5;
// Hide any model display at intersection points.
oIntStyle.GetDisplayStyleModel(InterferenceDisplayStyleType.Solid).Visible
= false;
ts.Commit();
}
Sample Program
PipeSample
<installation-directory>\Sample\Civil 3D
API\DotNet\VB.NET\PipeSample
Some of the sample code from this chapter can be found in context in the
PipeSample project. This sample creates a simple pipe network, creates pipe,
structure and interference styles, creates a parts list, and prints a hierarchy of
part types available in a document, separated into pipe and structure domains.
Corridors
This chapter covers creating and managing corridor objects using the AutoCAD
Civil 3D .NET API.
Root Objects
www.EngineeringBooksPdf.com
Ambient Settings
Ambient settings allow you to get and set the unit and default property settings
of roadway objects. Ambient settings for a corridor are accessed with the
SettingsCorridor object returned by
CivilDocument.Settings.GetFeatureSettings() method.
The corridor ambient settings object allows you to set the default name formats
and default styles for corridor-related objects. The name templates allow you
to set how new corridors, corridor surfaces, profiles from feature lines, or
alignments from feature lines are named. Each format can use elements from
the following property fields:
<[Next Counter(CP)]>
<[Corridor Name(CP)]>
...for SettingsCorridor.SettingsNameformat.ProfileFromFeatureLine
<[Next Counter(CP)]>
Corridors | 109
www.EngineeringBooksPdf.com
... for SettingsCorridor.SettingsNameFormat.AlignmentFromFeatureLine
<[Corridor Name(CP)]>
<[Next Counter(CP)]>
<[Profile Type]>
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.
Database.TransactionManager.StartTransaction())
{
// Get the name of the first alignment style in the
collection.
ObjectId alignId = doc.Styles.AlignmentStyles[0];
Alignment oAlignment = ts.GetObject(alignId,
www.EngineeringBooksPdf.com
OpenMode.ForRead) as Alignment;
// Assign the name to alignment style property.
oCorridorSettings.Styles.Alignment.Value =
oAlignment.Name;
}
The assembly ambient settings object allows you to set the default name
formats and default styles for assemblies. The name formats allow you to set
how new assemblies, offset assemblies, and assembly groups are named. Each
format can use elements from the following property fields:
<[Next Counter(CP)]>
<[Corridor Name(CP)]>
...for SettingsAssembly.NameFormat.Group
<[Next Counter(CP)]>
The subassembly ambient settings object allows you to set the default name
formats and default styles for subassembly objects. The name formats allow
you to set how subassemblies created from entities and subassemblies created
from macros are named. Each format can use elements from the following
property fields:
<[Next Counter(CP)]>
Corridors | 111
www.EngineeringBooksPdf.com
... for SettingsSubassembly.SettingsNameFormat.CreateFromEntities
<[Subassembly Side]>
<[Next Counter(CP)]>
<[Subassembly Side]>
NOTE
The name of the default code style set cannot be set with the .NET API.
Corridors
Corridor Concepts
A corridor represents a path, such as a road, trail, railroad, or airport runway.
The geometry of a corridor is defined by a horizontal alignment and a profile.
Together, these form the baseline - the centerline of the 3D path of the
corridor. Along the length of the baselines are a series of assemblies which
define the cross-sectional shape of the alignment. Common points in each
assembly are connected to form feature lines. Together the assemblies and
feature lines form the 3D shape of a corridor. A corridor also has one or more
surfaces which can be compared against an existing ground surface to
determine the amount of cut or fill required.
Listing Corridors
The collection of all corridors in a document are held in the
CivilDocument.CorridorCollection property.
www.EngineeringBooksPdf.com
The following sample displays the name and the largest possible triangle side
of every corridor in a document:
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.
Database.TransactionManager.StartTransaction())
{
foreach (ObjectId objId in doc.CorridorCollection)
{
Corridor myCorridor = ts.GetObject(objId,
OpenMode.ForRead) as Corridor;
ed.WriteMessage("Corridor: {0}\nLargest possible
triangle side: {1}\n",
myCorridor.Name,
myCorridor.MaximumTriangleSideLength);
}
}
Creating Corridors
You cannot add new Corridors to a document using the .NET API.
Baselines
A baseline represents the centerline of the path of a corridor. It is based on an
alignment (the horizontal component of the path) and a profile (the vertical
component of the path). A corridor can contain more than one baseline if the
corridor is modeling a complicated shape, such as an intersection. A baseline
is made up of one or more baseline regions. Each region has its own assembly
(its own cross section), so a corridor can have different shapes at different
locations along its length.
Corridors | 113
www.EngineeringBooksPdf.com
Listing Baselines in a Corridor
The collection of all baselines in a corridor are contained in the
Corridor.Baselines property, which is type BaselineCollection.
The AutoCAD Civil 3D API does not include methods for creating new baseline
regions, or manipulating existing regions.
The following sample displays the start and end station for every baseline
region in a baseline:
www.EngineeringBooksPdf.com
foreach (BaselineRegion oBaselineRegion in
oBaseline.BaselineRegions)
{
ed.WriteMessage(@"Baseline region information -
Start station : {0}
End station : {1}\n",
oBaselineRegion.StartStation,
oBaselineRegion.EndStation);
Corridors | 115
www.EngineeringBooksPdf.com
// Remove the station located at the beginning of the
baseline region:
oBaselineRegion.DeleteStation(oBaselineRegion.StartStation);
NOTE
The AutoCAD Civil 3D .NET API does not include methods for creating new
offset baselines or hardcoded offset baselines.
www.EngineeringBooksPdf.com
break;
case CorridorBaselineType.HardcodedOffsetBaseline:
HardcodedOffsetBaseline hob =
(HardcodedOffsetBaseline)ob;
ed.WriteMessage("Hardcoded offset baseline {0}
\n",
hob.Name);
ed.WriteMessage(" is offset by: {0} horizontal
and {1} vertical\n",
hob.OffsetElevationFromMainBaseline.X,
hob.OffsetElevationFromMainBaseline.Y);
break;
default:
break;
}
}
NOTE
The AutoCAD Civil 3D .NET API does not include methods for creating or
modifying assemblies.
Corridors | 117
www.EngineeringBooksPdf.com
Listing Applied Assemblies in a Baseline Region
The collection of all applied assemblies used in a baseline region are contained
in the BaselineRegion.AppliedAssemblies property.
The following sample displays information about the construction of an
assembly for every assembly in a baseline region:
}
An AppliedAssembly object does not contain its baseline station position.
Instead, each calculated point contains a property for determining its position
with a baseline station, offset, and elevation called
CalculatedPoint.StationOffsetElevationToBaseline. Each calculated shape
contains a collection of all links that form the shape, and each calculated link
contains a collection of all points that define the link. Finally, each shape,
link, and point contain an array of all corridor codes that apply to that element.
This sample retrieves all calculated points in an applied assembly and prints
their locations:
www.EngineeringBooksPdf.com
Getting Applied Subassembly Information
An applied subassembly consists of a series of calculated shapes, links, and
points, represented by objects of type CalculatedShape, CalculatedLink, and
CalculatedPoint respectivly.
Feature Lines
Feature lines are formed by connecting related points in each assembly along
the length of a corridor baseline. These lines represent some aspect of the
roadway, such as a sidewalk edge or one side of a corridor surface. Points
become related by sharing a common code, a string property usually describing
the corridor feature.
Each baseline has two sets of feature lines, one for lines that are positioned
along the main baseline and one for lines that are positioned along any of
the offset baselines.
Corridors | 119
www.EngineeringBooksPdf.com
NOTE
Creating feature lines from polylines is not supported in the .NET API.
However, you can use the COM API IAeccLandFeatureLine::
AddFromPolyline() method.
www.EngineeringBooksPdf.com
}
}
}
Corridors | 121
www.EngineeringBooksPdf.com
}
}
}
Each offset baseline and hardcoded offset baseline also has direct access to the
feature lines related to itself. The BaselineFeatureLines collection is accessed
through the RelatedOffsetBaselineFeatureLines property in both types of
offset baselines.
Corridor Surfaces
Corridor surfaces can represent the base upon which the corridor is constructed,
the top of the finished roadway, or other aspects of the corridor. Such surfaces
are represented by the Surface class and by the unrelated CorridorSurface
class. CorridorSurface objects contain corridor-specific information about
the surfaces, such as which feature line, point, and link codes were used to
create it.
NOTE
The AutoCAD Civil 3D .NET API does not include methods for creating new
corridor surfaces or modifying existing corridor surfaces.
This sample lists all the corridor surfaces within a corridor and specifies the
point codes that make up each surface:
// List surfaces
foreach (CorridorSurface oCorridorSurface in
oCorridor.CorridorSurfaces)
{
www.EngineeringBooksPdf.com
ed.WriteMessage("Corridor surface: {0}\n",
oCorridorSurface.Name);
NOTE
The AutoCAD Civil 3D .NET API does not include methods for creating or
modifying corridor boundaries or masks.
This sample loops through all the boundaries of a corridor surface and displays
information about each:
// List boundaries
foreach (CorridorSurfaceBoundary oCorridorSurfaceBoundary
Corridors | 123
www.EngineeringBooksPdf.com
in oCorridorSurface.Boundaries)
{
if (oCorridorSurfaceBoundary.BoundaryType ==
CorridorSurfaceBoundaryType.InsideBoundary)
ed.WriteMessage("Inner Boundary: ");
else
ed.WriteMessage("Outer Boundary: ");
ed.WriteMessage(oCorridorSurfaceBoundary.Name);
www.EngineeringBooksPdf.com
Computing Cut and Fill
The .NET API doesn notexpose surface functionality, so it isn’t possible to
calculate cut and fill volumes by comparing surfaces. However, you can perform
this task with the COM API. See for more information.
Styles
These style objects control the visual appearance of applied assemblies.
Assembly Style
The collection of all assembly style objects are found in the
CivilDocument.Styles.AssemblyStyles property. The assembly style object
contains properties for adjusting the marker types for the assembly attachment
points, and each of the standard MarkerType properties. While you can create
new styles and edit existing styles, you cannot assign a style to an existing
assembly using the AutoCAD Civil 3D .NET API.
using (Transaction ts =
Application.DocumentManager.MdiActiveDocument.
Database.TransactionManager.StartTransaction())
{
ObjectId objId =
doc.Styles.AssemblyStyles.Add("Style1");
AssemblyStyle oAssemblyStyle = ts.GetObject(objId,
OpenMode.ForWrite) as AssemblyStyle;
objId = oAssemblyStyle.MarkerStyleAtMainBaselineId;
MarkerStyle oMarker = ts.GetObject(objId,
OpenMode.ForWrite) as MarkerStyle;
oMarker.CustomMarkerStyle =
CustomMarkerType.CustomMarkerX;
oMarker.MarkerDisplayStylePlan.Color =
Color.FromColorIndex(ColorMethod.ByAci, 10);
oMarker.MarkerDisplayStylePlan.Visible = true;
ts.Commit();
}
Corridors | 125
www.EngineeringBooksPdf.com
Link Style
The collection of all link style objects are found in the
CivilDocument.Styles.LinkStyles property. This style object contains
properties for adjusting the visual display of assembly and subassembly links.
NOTE
Link style objects are not used directly with link objects, but are instead used
with roadway style sets.
ts.Commit();
Shape Style
The collection of all shape style objects are found in the
CivilDocument.ShapeStyles property. This style object contains properties
for adjusting the visual display of assembly and subassembly shapes, including
the outline and the inside area.
NOTE
Shape style objects are not used directly with shape objects, but are instead
used with roadway style sets.
www.EngineeringBooksPdf.com
Color.FromColorIndex(ColorMethod.ByAci, 50);
oShapeStyle.AreaFillDisplayStylePlan.Visible = true;
oShapeStyle.AreaFillHatchDisplayStylePlan.HatchType =
HatchType.PreDefined;
oShapeStyle.AreaFillHatchDisplayStylePlan.Pattern = "LINE";
// 30 = orange
oShapeStyle.BorderDisplayStylePlan.Color =
Color.FromColorIndex(ColorMethod.ByAci, 30);
oShapeStyle.BorderDisplayStylePlan.Visible = true;
ts.Commit();
NOTE
You cannot set the CodeSetStyle to be the currently used style with the .NET
API. However, you can get the ObjectId for the currently used style by calling
CodeSetStyle.GetCurrentStyleSetId().
ts.Commit();
Corridors | 127
www.EngineeringBooksPdf.com
Points
This chapter covers creating and using Coordinated Geometry (COGO) Points,
exposed by the CogoPoint class, with the .NET API. It describes accessing the
collection of all points in the CivilDocument, adding and removing points,
assigning User Defined Properties (UDPs) to points, and working with
PointGroup objects to organize points. It also describes creating and applying
point styles and label styles to points.
[CommandMethod("C3DSAMPLES", "AverageCogoElevation",
CommandFlags.Modal)]
public void AverageCogoElevation()
{
using (Transaction tr = startTransaction())
{
CogoPointCollection cogoPoints =
_civildoc.CogoPoints;
Point3d[] points = { new Point3d(4927, 3887, 150),
new Point3d(5101, 3660, 250), new Point3d(5144, 3743, 350)
};
Point3dCollection locations = new
Point3dCollection(points);
cogoPoints.Add(locations);
www.EngineeringBooksPdf.com
in a document.
double avgElevation = 0;
foreach (ObjectId pointId in cogoPoints)
{
CogoPoint cogoPoint =
pointId.GetObject(OpenMode.ForRead) as CogoPoint;
avgElevation += cogoPoint.Elevation;
}
avgElevation /= cogoPoints.Count;
_editor.WriteMessage("Average elevation: {0}
\nNumber of points: {1}", avgElevation, cogoPoints.Count);
tr.Commit();
}
}
Using Points
Coordinated Geometry Points (COGO points) are more complex than AutoCAD
point nodes, which have only coordinate data. A CogoPoint object, in addition
to a location, also has properties such as a unique ID number, name, raw (field)
description, and full (expanded) description. The point number is unique,
and is automatically assigned when the point is created. You can change the
point number either by setting the PointNumber property directly, or by using
the Renumber() method. Setting the property directly will throw an exception
if another point exists with the specified value, while the Renumber() method
will use the settings for resolving point numbering conflicts to choose another
point number. You can also set the PointNumber property for multiple points
using the CogoPointCollection.SetPointNumber() method.
The full description property is read-only once a point is created.
The CogoPoint object’s Location property is read-only. However, you can read
and change the local position using the Easting, Northing and Elevation
properties. The point’s location can also be specified by using the Grideasting
and GridNorthing properties or the Latitude and Longitude properties,
depending on the coordinate and transformation settings of the drawing.
A CogoPoint object is either a drawing point or a project point. Project points
have the isProjectPoint property set to true, and have additional project
information contained by the IsCheckedOut and ProjectVersion properties.
Points | 129
www.EngineeringBooksPdf.com
Attempting to get or set these properties for points that have isProjectPoint
== false raises an exception, so it is a good idea to check that property first.
CogoPoint objects also have several read-only override properties that contain
values that have been overridden by PointGroup settings. These include
ElevationOverride, FullDescriptionOverride, LabelStyleIdOverride,
RawDescriptionOverride, and StyleIdOverride.
This sample adds a new point to the document’s collection of points and sets
some of its properties.
[CommandMethod("C3DSAMPLES", "CreatePoint",
CommandFlags.Modal)]
public void CreatePoint()
{
using (Transaction tr = startTransaction())
{
// _civildoc is the active CivilDocument instance.
tr.Commit();
}
}
www.EngineeringBooksPdf.com
3 Set the property for all points in a list to a value in a corresponding list
of values.
The list of points can be a sub-collection of points, or you can pass the
CivilDocument.CogoPoints collection to process all points in the document.
Points | 131
www.EngineeringBooksPdf.com
This sample creates a new user-defined property classification for points called
“Example”, and then adds a new user-defined property with upper and lower
bounds and a default value:
[CommandMethod("C3DSAMPLES", "UDPExample",
CommandFlags.Modal)]
public void UDPExample()
{
using (Transaction tr = startTransaction())
{
// _civildoc is the active CivilDocument instance.
UDPClassification udpClassification =
_civildoc.PointUDPClassifications.Add("Example");
AttributeTypeInfoInt attributeTypeInfoInt = new
AttributeTypeInfoInt("Int UDP");
attributeTypeInfoInt.DefaultValue = 15;
attributeTypeInfoInt.UpperBoundValue = 20;
attributeTypeInfoInt.LowerBoundValue = 10;
UDP udp =
udpClassification.CreateUDP(attributeTypeInfoInt);
tr.Commit();
}
}
This example illustrates accessing the collection of all Point UDPClassifications
in a document, and then reading each UDP in each UDPClassification.
[CommandMethod("C3DSAMPLES", "ListUDPs",
CommandFlags.Modal)]
public void ListUDPs()
{
using (Transaction tr = startTransaction())
{
// _civildoc is the active CivilDocument instance.
www.EngineeringBooksPdf.com
foreach (UDPClassification udpClassification in
_civildoc.PointUDPClassifications)
{
_editor.WriteMessage("\n\nUDP Classification:
{0}\n", udpClassification.Name);
foreach (UDP udp in udpClassification.UDPs)
{
_editor.WriteMessage(" * UDP name: {0}
guid: {1}, description: {2}, default value: {3}, use
default? {4}\n",
udp.Name, udp.Guid, udp.Description,
udp.DefaultValue, udp.UseDefaultValue);
case "UDPInteger":
UDPInteger udpInteger =
(UDPInteger)udp;
_editor.WriteMessage("\tUpper value:
{0}, inclusive? {1}, Lower bound value: {2}, inclusive?
{3}\n",
udpInteger.UpperBoundValue,
udpInteger.UpperBoundInclusive, udpInteger.LowerBoundValue,
udpInteger.LowerBoundInclusive);
break;
case "UDPDouble":
UDPDouble udpDouble =
(UDPDouble)udp;
_editor.WriteMessage("\tUpper value:
{0}, inclusive? {1}, Lower bound value: {2}, inclusive?
{3}\n",
udpDouble.UpperBoundValue,
Points | 133
www.EngineeringBooksPdf.com
udpDouble.UpperBoundInclusive, udpDouble.LowerBoundValue,
udpDouble.LowerBoundInclusive);
break;
case "UDPEnumeration":
UDPEnumeration udpEnumeration =
(UDPEnumeration)udp;
_editor.WriteMessage("\tEnumeration
values: {0}\n", udpEnumeration.GetEnumValues());
break;
}
}
}
tr.Commit();
}
}
Point Groups
A point group is a collection that defines a subset of the points in a document.
Points may be grouped for a number of reasons, such as points that share
common characteristics or are used to perform a common task (for example,
define a surface). A collection of all point groups in a drawing is held in a
document‘s CivilDocument.PointGroups property. Add a new point group by
using the CivilDocument.PointGroups.Add() method and specifying a unique
identifying string name. The ObjectId for a new, empty point group is
returned.
// _civildoc is the active CivilDocument instance.
ObjectId pointGroupId = _civildoc.PointGroups.Add("Example
Point Group");
PointGroup pointGroup =
pointGroupId.GetObject(OpenMode.ForRead) as PointGroup;
www.EngineeringBooksPdf.com
// Check to see if a particular point exists in the
PointGroup
ObjectId pointId = promptForEntity("Select a point",
typeof(CogoPoint));
CogoPoint cogoPoint = pointId.GetObject(OpenMode.ForRead)
as CogoPoint;
if (pointGroup.ContainsPoint(cogoPoint.PointNumber){
_editor.WriteMessage("Point {0} is not part of
PointGroup {1}",
cogoPoint.PointName, pointGroup.Name);
}
Points | 135
www.EngineeringBooksPdf.com
Properties Possible Values
Example: “<-100,1-100,110.01,>200” –
specifies all points whose elevations meet
one of the following criteria: less than -100,
equal to or between 1 and 100, equal to
110.01, or greater than 200.
All of the Include* properties are ORed together, and all the Exclude*
properties are ORed together to create the final query string. The example
below illustrates how the query string is built from properties:
// _civildoc is the active CivilDocument instance.
ObjectId pointGroupId = _civildoc.PointGroups.Add("Example
Point Group1");
www.EngineeringBooksPdf.com
PointGroup pointGroup =
pointGroupId.GetObject(OpenMode.ForWrite) as PointGroup;
pointGroup.SetQuery(standardQuery);
pointGroup.Update();
// output:
// Query string: (FullDescription='FLO*' OR
PointElevation=100-200 OR
// PointNumber>2200) AND '' NOT (Name='BRKL' OR
PointElevation=150-155)
The CustomPointGroupQuery lets you specify a query string directly, and
requires a more advanced knowledge of query operators. This method of query
creation allows you to create nested queries that cannot be specified using the
StandardPointGroupQuery object.
Custom queries are made up of expressions, and expressions have three parts:
1 A property
2 A comparison operator: > < >= <= =
3 A value
Multiple expressions are separated by logical set operators: AND, OR and NOT.
Precedence of expressions and expression sets can be specified using
parentheses.
The precedence of evaluation in queries is:
Points | 137
www.EngineeringBooksPdf.com
2 NOT
3 Comparisons
4 AND
5 OR
The example below illustrates creating a point group and adding a custom
query to it:
ObjectId pointGroupId2 = _civildoc.PointGroups.Add("Example
Point Group2");
PointGroup pointGroup2 =
pointGroupId2.GetObject(OpenMode.ForWrite) as PointGroup;
CustomPointGroupQuery customQuery = new
CustomPointGroupQuery();
string queryString = "(RawDescription='GR*') AND
(PointElevation>=100 AND PointElevation<=300)";
customQuery.QueryString = queryString;
pointGroup2.SetQuery(customQuery);
pointGroup2.Update();
_editor.WriteMessage("PointGroup2: \n # points selected:
{0}\n",
pointGroup2.PointsCount);
Pending changes for a PointGroup can be accessed from the
PointGroup.GetPendingChanges() method, which returns a
PointGroupChangeInfo object. The pending change information for a
PointGroup is updated when:
■ A new point is added to the drawing that matches the query for the
PointGroup.
Note that changes are not registered when the query itself is changed.
The example below adds a point that matches the custom query illustrated
above, and removes a point from the PointGroup, registering both an added
and removed point change in the PointGroupChangeInfo for the PointGroup.
Point3d point3d = new Point3d(100,200,225); // elevation
will be matched
string rawDesc = "GRND"; // raw description will be matched
_civildoc.CogoPoints.Add(point3d, rawDesc);
www.EngineeringBooksPdf.com
PointGroupChangeInfo pointGroupChangeInfo =
pointGroup2.GetPendingChanges();
_editor.WriteMessage("Point group {0} pending changes: \n
add: {1} \n remove: {2}\n",
pointGroup2.Name,
pointGroupChangeInfo.PointsToAdd.Length,
pointGroupChangeInfo.PointsToRemove.Length);
Point Style
The PointStyle class defines how a point is drawn. Labels attached to
CogoPoints are styled with objects of type LabelStyle. This section covers
creating and applying point and label styles to CogoPoints. It also covers using
point description keys to match points by name and apply styles to them.
Points | 139
www.EngineeringBooksPdf.com
The point marker type is set by the PointStyle’s MarkerType property, and
can be a symbol, custom marker, or an AutoCAD point style. Custom markers
are set using the CustomMarkerStyle and CustomMarkersuperimposeStyle
properties. Symbol markers are set using the MarkerSymbolName property,
which is a string that names an AutoCAD BLOCK symbol in the drawing.
Points assigned to PointGroups may have their styles overridden by the
PointGroup. You can check the overridden style ID using the
LabelStyleIdOverride and StyleIdOverride properties.
This sample creates a new points style, adjusts the style settings, and the assigns
the style to point “cogoPoint1”:
// Create a point style that uses a custom marker,
// a Plus sign inside a square.
ObjectId pointStyleId =
_civildoc.Styles.PointStyles.Add("Example Point Style");
PointStyle pointStyle =
pointStyleId.GetObject(OpenMode.ForWrite) as PointStyle;
pointStyle.MarkerType =
PointMarkerDisplayType.UseCustomMarker;
pointStyle.CustomMarkerStyle =
CustomMarkerType.CustomMarkerPlus;
pointStyle.CustomMarkerSuperimposeStyle =
CustomMarkerSuperimposeType.Square;
Point label styles can use the following property fields in the contents of any
text components:
<[Name(CP)]>
www.EngineeringBooksPdf.com
Valid property fields for LabelStyle TextComponent Contents
<[Point Number]>
<[Northing(Uft|P4|RN|AP|Sn|OF)]>
<[Easting(Uft|P4|RN|AP|Sn|OF)]>
<[Raw Description(CP)]>
<[Full Description(CP)]>
<[Point Elevation(Uft|P3|RN|AP|Sn|OF)]>
<[Latitude(Udeg|FDMSdSp|P6|RN|DPSn|CU|AP|OF)]>
<[Longitude(Udeg|FDMSdSp|P6|RN|DPSn|CU|AP|OF)]>
<[Grid Northing(Uft|P4|RN|AP|Sn|OF)]>
<[Grid Easting(Uft|P4|RN|AP|Sn|OF)]>
<[Scale Factor(P3|RN|AP|OF)]>
<[Convergence(Udeg|FDMSdSp|P6|RN|AP|OF)]>
<[Survey Point]>
For more general information about creating and using label styles, see the
Label Styles (page 27) section.
Points | 141
www.EngineeringBooksPdf.com
matching code. If any new points are created with a description that matches
the code of an existing key, the point is assigned all the settings of that key.
The wildcards “?” and “*” are allowed in the code. Keys can contain either
constant scale or rotation values for points or can assign orientation values
depending on parameters passed through the description string. Point
description keys are held in sets, objects of type PointDescriptionKeySet.
The collection of all sets in a document are accessed with the
PointDescriptionKeySetCollection.GetPointDescriptionKeySets() static
method.
The collection of all key sets also exposes a SearchOrder property, which lets
you specify the order that key sets are searched for matches when description
keys are applied. Key sets at the beginning of the SearchOrder collection are
searched first and therefore have higher priority. In the example below, this
property is accessed, and the last item is moved to the first position.
// Create a Key Set in the collection of all Key Sets:
ObjectId pointDescriptionKeySetId =
PointDescriptionKeySetCollection.GetPointDescriptionKeySets(_acaddoc.Database).Add("Example
Key Set");
PointDescriptionKeySet pointDescriptionKeySet =
pointDescriptionKeySetId.GetObject(OpenMode.ForWrite) as
PointDescriptionKeySet;
www.EngineeringBooksPdf.com
pointDescriptionKey.ApplyScaleXY = true;
PointDescriptionKeySetCollection.GetPointDescriptionKeySets(_acaddoc.Database).SearchOrder;
ObjectId keySetId = pdKeySetIds[pdKeySetIds.Count-1];
pdKeySetIds.Remove(keySetId);
pdKeySetIds.Insert(0, keySetId);
PointDescriptionKeySetCollection.GetPointDescriptionKeySets(_acaddoc.Database).SearchOrder
=
pdKeySetIds;
Overview
This chapter describes how to create a custom subassembly using Visual Basic
.NET. This is the currently supported and preferred method of creating custom
subassemblies.
This chapter covers design considerations, the structure of subassembly
programs, and an example subassembly in VB that you can use as a template
for your own custom subassemblies.
www.EngineeringBooksPdf.com
Subassembly Changes
The “target mapping’ feature in AutoCAD Civil 3D 2013 has changed, which
affects how custom subassemblies are written. This feature now allows a
subassembly to target object types in addition to alignments and profiles
associated with the corridor that it requires to define its geometry. For more
information about this feature, see Setting and Editing Targets in the .
There are four changes to the way you write a custom subassembly:
A subassembly can now target an offset target and elevation target (instead
of an alignment and a profile), which are represented by new parameter types
in ParamLogicalNameType. If you want to support the new target types in your
subassemblies, you need to replace:
■ ParamLogicalNameType.Alignment with
■ ParamLogicalNameType.OffsetTarget — offset targets that are
alignments, feature lines, survey figures and AutoCAD polylines OR
■ ParamLogicalNameType.OffsetTargetPipe — offset targets that are pipe
networks
■ ParamLogicalNameType.Profile with
■ ParamLogicalNameType.ElevationTarget — elevation targets that are
profiles, feature lines, survey figures and AutoCAD 3D polylines OR
■ ParamLogicalNameType.ElevationTargetPipe — elevation targets that
are pipe networks
To get the offset and elevation target collections from the corridorState
object, use ParamsOffsetTarget and ParamsElevationTarget instead of
ParamsAlignment and ParamsProfile. All the offset targets (including network
pipe offset targets) are in ParamsOffsetTarget, and all elevation targets
www.EngineeringBooksPdf.com
(including network pipe elevation targets) are in ParamsElevationTarget.
Here’s an example from the BasicLaneTransition.vb sample in the Sample
VB.NET Subassembly (page 160) section below:
Dim oParamsOffsetTarget As
ParamOffsetTargetCollection
oParamsOffsetTarget =
corridorState.ParamsOffsetTarget
Changes to CalcAlignmentOffsetToThisAlignment()
www.EngineeringBooksPdf.com
dOffsetElev =
elevationTarget.GetElevation(oCurrentAlignmentId, _
corridorState.CurrentStation,
Utilities.GetSide(vSide))
Catch
Utilities.RecordWarning(corridorState,
_
CorridorError.LogicalNameNotFound,
_
"TargetHA", "BasicLaneTransition")
dOffsetElev =
corridorState.CurrentElevation + vWidth * vSlope
End Try
www.EngineeringBooksPdf.com
The list below describes the attachment and insertion methodology for three
categories of subassemblies: medians, components joining two roadways, and
rehabilitation and overlay.
■ Medians. Medians tend to be inserted in both the left and right directions
simultaneously about a centerline (which is not necessarily the corridor
baseline alignment). Furthermore, the attachment point may not be a
point on the median surface links. For example, the attachment point for
a depressed median subassembly may be above the median ditch at the
elevation of the inside edges-of-traveled-way.
■ Components Joining Two Roadways. When modeling separated
roadways in a single corridor model, it is often necessary to insert
intersection fill slopes, or to connect from one edge-of-roadway to another.
Typically, you assemble the components for as much of the first roadway
as possible, switch baselines and assemble the components for the second
roadway, then use special subassemblies to connect between the two
roadways. In this case, two attachment points are needed. Do this by
creating a subassembly with a normal attachment point on one side, and
which attaches to a previously defined marked point on the other.
■ Rehabilitation and Overlay. Typically, subassemblies that are used
to strip pavement, level, and overlay existing roads are placed based on
calculations involving the shape of the existing roadway section, rather
than using a design centerline alignment and profile. For example, a
pavement overlay subassembly may require a minimum vertical distance
from the existing pavement for a given design slope. A lane-widening
subassembly may need to attach to the existing edge-of-traveled-way and
match the existing lane slope.
www.EngineeringBooksPdf.com
commonly-used variations of the same basic shape with different dimensions,
it may be better to provide five separate subassemblies with hard-coded
dimensions rather than making the user define the dimensions on a single
subassembly. For example, users may be comfortable selecting from separate
subassemblies for curb types A-E, which have predefined, hard-coded
dimensions. You can always provide a generic subassembly with variable
dimensions for scenarios where the common ones do not apply.
www.EngineeringBooksPdf.com
Input Parameter Description
Ratio Slopes Cut slopes, fill slopes, ditch side slopes, median slopes, and
many other roadway components are commonly expressed as
a run-to-rise ratio, such as 4 : 1. These may be signed or un-
signed values, depending on circumstances. For example, a fill
slope is always downward, so it may not be necessary to force
the user to enter a value like “-4”.
Point, Link, and Shape In most cases, point, link, and shape codes should be hard-
Codes coded to ensure that consistent codes are assigned across the
entire assembly. The primary exception is with generic link
subassemblies that allow users to add links to the assembly as
needed. These might be used for paved or unpaved finish grade,
structural components, pavement subsurfaces, and many other
unanticipated components. In these scenarios, the end-user
assigns point, link, and shape codes that coordinate with the
overall assembly.
www.EngineeringBooksPdf.com
■ Pivot point is at the edge-of-traveled-way on the inside of the curve, while
the PGL is at the centerline of the road.
■ On a divided road with crowned roadways, the PGL is at the crown points,
while the pivot point is at the inside edge-of-traveled-ways.
■ On a divided road with uncrowned roadways, the PGL and pivot point is
above the median at the centerline.
Whatever the situation, the subassemblies must be designed so that they can
be placed with the correct behavior.
Sometimes the roadway components have special behavior in superelevated
sections. Some examples of special superelevation behavior:
■ Broken Back Subbase. Some agencies put a break point in the subbase
layer on the high side of superelevation. The subbase parallels the finish
grade up to a certain point, then extends at a downward slope until it
intersects the shoulder or clear zone link.
■ Shoulder Breakover. Usually a maximum slope difference, or breakover,
must be maintained between the travel lane and the shoulder, or between
the paved and unpaved shoulder links.
■ Curbs-and-Gutters. Some agencies require that gutters on the high side
of a superelevated road tip downward toward the low side, while others
leave the gutters at their normal slope.
NOTE
When writing your custom subassembly, avoid writing code that makes
AutoCAD calls and interrupts AutoCAD Civil 3D subassembly operations
during runtime. For example, avoid building selection sets.
This section explains the methods that must be called when creating
subassemblies that use superelevation and support axis of rotation calculations.
■ If one subassembly in an assembly is specified as a potential pivot, all
subassemblies between it and the baseline that use superelevation must
report their superelevation cross slope data to the corridor using the
Autodesk.CIvil.Runtime.CorridorState method:
www.EngineeringBooksPdf.com
Autodesk.Civil.Land.SuperelevationCrossSegmentType, ByVal
isReversedSlope As Boolean)
superElevationSlope is the cross slope used in the subassembly. For axis of
rotation to work correctly, it must be the value obtained from lane type
superElevationSlopeType in the superelevation table. If the value obtained
from the table is adjusted in any way, axis of rotation will not work
properly.
isReversedSlope set to True indicates that the cross slope applied is the
negated value obtained from the superelevation table.
■ The LaneSuperelevationAOR subassembly, which is provided in the
AutoCAD Civil 3D content, supports axis of rotation pivot points. If
LaneSuperelevationAOR (or a custom subassembly that supports pivot
points) is not contained in the assembly, the pivot type specified in the
Calculate Superelevation wizard is ignored, and the Baseline Pivot Type is
applied. A custom subassembly can support axis of rotation pivot points
by passing in True for the isPotentialPivot argument when calling
SetAxisOfRotationInformation().
■ To determine the Centers pivots in a divided crowned roadway, the crown
points specified in the subassemblies supporting pivots are used. To specify
a crown point to be used in axis of rotation calculations when building
the corridor, use the Autodesk.Civil.Runtime.CorridorState method:
■ By default, the axis of rotation calculation assumes that the recorded cross
slope is applied to the full width of the subassembly in its calculation. The
starting offset will be the smallest offset in a subassembly drawn to the
right, and the largest offset for a subassembly drawn to the left. If the
subassembly is applying the cross slope to just a portion of the subassembly,
record the starting and ending offsets of this range with the corridor using
the Autodesk.Civil.Runtime.CorridorState method:
www.EngineeringBooksPdf.com
Public Sub SetAxisOfRotationSERange (ByVal
dApplySE_StartOffset As Double, ByVal dApplySE_EndOffset
As Double)
■ Only one set of axis of rotation information can be recorded per assembly.
This means that the calculated delta Y value is the same no matter which
point in the subassembly is used as the attachment point. Therefore, if a
subassembly applies multiple cross slopes, or a single cross slope affects
only certain point in the subassembly, only the pivot location will be
correctly calculated and recorded to the corridor.
■ If a subassembly uses superelevation, but does not record the superelevation
cross slope data with the corridor, it should notify the corridor so that the
corridor can issue a warning that axis of rotation results may be unexpected.
To notify the corridor, call the following method in Utilities class:
When creating custom subassemblies, you should also create a custom Help
file to accompany the subassembly. You can use a Microsoft Compiled HTML
www.EngineeringBooksPdf.com
Help file (.chm) to create the subassembly Help file. The Help file content and
style should be similar to that in the AutoCAD Civil 3D Subassembly Reference
Help. The table below describes the sections that should be included, as a
minimum, in subassembly Help files. This information is required so that
users understand the subassembly behavior and intended use.
Section Description
Descriptions A brief description of the subassembly that includes the type of compon-
ent the subassembly creates (for example, a lane, median, or shoulder),
special features, and situations it is designed to cover.
Attachment Describes where the attachment point is located relative to the sub-
assembly links.
Input Paramet- Describes each of the user-definable input parameters that can be spe-
ers cified when using the subassembly. These should precisely match the
parameter names and order seen by the user when using the assembly
layout tool, and should describe the effect of each parameter. These are
best presented in a table that includes a description of each parameter,
the type of input expected, and default values for metric or imperial unit
projects. For input parameters for slope values, note that there are two
common ways of specifying slopes: as a percent value like -2%, or as a
www.EngineeringBooksPdf.com
Section Description
Target Para- Describes the parameters in the subassembly that can be mapped to
meters one or more target objects.
Input parameters are defined when building an assembly in layout mode.
Target parameters are substitutions that can be made for input paramet-
ers when applying the assembly to a corridor model. Typically, sub-
assembly parameters that can use a target object to define a width or
an offset can use the following types of objects to define that width or
offset: alignments, AutoCAD polylines, feature lines, or survey figures.
Similarly, subassembly parameters that can use a target object to define
an elevation can use the following types of objects to define that eleva-
tion: profiles, AutoCAD 3D polylines, feature lines, or survey figures.
Subassemblies that can use a target object to define a surface can only
use a surface object to define that surface. A few subassemblies allow
you to use pipe network objects as targets, such as the TrenchPipe sub-
assemblies.
A typical scenario is a travel lane where the width is a numeric input
parameter, which can use an alignment as a target parameter to replace
the numeric width. The given numeric width is used when displaying
the lane in layout mode. If an alignment is given, the width is calculated
at each station during corridor modeling to tie to the offset of the
alignment. For more information, see Setting and Editing Targets in the
.
www.EngineeringBooksPdf.com
Section Description
Layout Mode During the process of creating an assembly from subassemblies, also
Operation known as the assembly layout mode, specific information such as align-
ment offsets, superelevation slopes, profile elevations, and surface data,
are not known. The Layout Mode Operation section of the subassembly
Help file describes how the subassembly is displayed in the assembly
layout mode. Layout mode refers to an assembly that has not yet been
applied to a corridor. Some subassemblies behave differently in different
situations. For example, a Daylight type of subassembly may create dif-
ferent geometric shapes depending on whether it is in a cut or fill situ-
ation. Shoulders may behave differently for normal crown and superel-
evated roadways. In layout mode, the subassembly designer must specify
some arbitrary choices as to how the subassembly is displayed. It should
appear as much like the final result in the corridor model as possible.
Lanes and shoulders, for example, should be shown at typical normal
crown slopes. Where there is alternate geometry, such as for the cut and
fill daylight cases, both cases should be shown. Also, links that extend
to a surface should be shown with arrowheads indicating the direction
of extension.
Layout Mode A diagram illustrating layout mode behavior and visual representation
Diagram is useful if layout mode behavior and/or visual representation of the
subassembly differs significantly between layout mode when the assembly
and its associated subassemblies are applied to a corridor.
Point, Link, Describes the items that are hard-coded into the subassembly, including
and Shape dimensions, point codes, link codes, and shape codes. Common practice
Codes is to reference the point, link, and shape codes to labels on the coding
diagram.
Coding Dia- The coding diagram has a twofold purpose. First, it labels the point, link,
gram and shape numbers referred to in the previous section. Secondly, it
provides the subassembly programmer with a numbering scheme for
points, links, and shapes. These should correspond to the array indices
used in the script for points, links, and shapes. This is to make it easier
to later modify or add to the subassembly.
After creating the custom Help files for custom subassemblies, you must
reference the Help files in the tool catalog .atc file associated with the
www.EngineeringBooksPdf.com
subassemblies. For more information, see Sample Tool Catalog ATC File (page
175).
www.EngineeringBooksPdf.com
The Corridor State Object
A reference to an object of type CorridorState is passed to each of the
SATemplate methods you override. The CorridorState object is the primary
interface between the custom subassembly and the collection of points, links,
and shapes of the current assembly which the subassembly is to connect to.
It provides references to the current alignment, profile, station, offset,
elevation, and style, which may affect the appearance of the subassembly. It
also includes several parameter buckets used for collecting parameters of types
boolean, long, double, string, alignment, profile, surface, and point. Each
parameter is defined by a literal name and a value.
The CorridorState methods provide useful calculation functions for corridor
design. These include the following:
www.EngineeringBooksPdf.com
Utilities.vb provides a series of shared helper functions for error handling,
computing subassembly geometry, attaching code strings, and other tasks.
For example, to report a “parameter not found” error to the AutoCAD Civil
3D event viewer, use the following line:
Utilities.RecordError( _
corridorState, _
CorridorError.ParameterNotFound, _
"Edge Offset", _
"BasicLaneTransition")
The following table lists all the functions within the Utility class:
www.EngineeringBooksPdf.com
Utility function Description
www.EngineeringBooksPdf.com
Utility function Description
The CodesSpecific.vb and Utilities.vb files are located in the <AutoCAD Civil 3D
Install Directory>\Sample\Civil 3D API\C3DStockSubAssemblies directory.
Option Explicit On
www.EngineeringBooksPdf.com
Option Strict Off
Imports System.Math
Imports DBTransactionManager =
Autodesk.AutoCAD.DatabaseServices.TransactionManager
'
*************************************************************************
'
*************************************************************************
'
*************************************************************************
' Name: BasicLaneTransition
'
' Description: Creates a simple cross-sectional
representation of a corridor
' lane composed of a single closed shape.
Attachment origin
' is at top, most inside portion of lane.
The lane can
' transition its width and cross-slope based
on the position
' supplied by an optional horizontal and
vertical alignment.
'
' Logical Names: Name Type Optional Default
value Description
'
--------------------------------------------------------------
' TargetHA Alg yes none
Horizontal alignment to transition to
' TargetVA Profile yes none
Vertical alignment to transition to
'
' Parameters: Name Type Optional
Default Value Description
'
------------------------------------------------------------------
' Side long yes Right
specifies side to place SA on
' Width double yes 12.0
width of lane
' Depth double yes 0.667
depth of coarse
' Slope double yes -0.02
www.EngineeringBooksPdf.com
cross-slope of lane
' TransitionType long yes 2
hold grade, move to offset HA
' InsertionPoint long yes kCrown
Specifies insertion point of the lane either at
(a) Crown or (b) Edge of Travel Way
' CrownPtOnInside Long no g_iTrue
Specifies that inside edge of travelway to be
coded as Crown
'
*************************************************************************
Public Class BasicLaneTransition
Inherits SATemplate
Private Enum InsertionPoint
kCrown = 0
kEdgeOfTravelWay = 1
End Enum
Private Enum TransitionTypes ' Transition types
supported
kHoldOffsetAndElevation = 0
kHoldElevationChangeOffset = 1
kHoldGradeChangeOffset = 2
kHoldOffsetChangeElevation = 3
kChangeOffsetAndElevation = 4
End Enum
'
--------------------------------------------------------------------------
' Default values for input parameters
Private Const SideDefault = Utilities.Right
Private Const InsertionPointDefault =
InsertionPoint.kCrown
Private Const CrownPtOnInsideDefault = Utilities.IFalse
Private Const LaneWidthDefault = 12.0#
Private Const LaneDepthDefault = 0.667
Private Const LaneSlopeDefault = -0.02 '0.25 inch
per foot
Private Const HoldOriginalPositionDefault =
TransitionTypes.kHoldOffsetAndElevation
Protected Overrides Sub GetLogicalNamesImplement(ByVal
corridorState As CorridorState)
MyBase.GetLogicalNamesImplement(corridorState)
' Retrieve parameter buckets from the corridor
state
www.EngineeringBooksPdf.com
Dim oParamsLong As ParamLongCollection
oParamsLong = corridorState.ParamsLong
' Add the logical names we use in this script
Dim oParamLong As ParamLong
oParamLong = oParamsLong.Add("TargetHA",
ParamLogicalNameType.OffsetTarget)
oParamLong.DisplayName = "690"
oParamLong = oParamsLong.Add("TargetVA",
ParamLogicalNameType.ElevationTarget)
oParamLong.DisplayName = "691"
End Sub
Protected Overrides Sub
GetInputParametersImplement(ByVal corridorState As
CorridorState)
MyBase.GetInputParametersImplement(corridorState)
' Retrieve parameter buckets from the corridor
state
Dim oParamsLong As ParamLongCollection
oParamsLong = corridorState.ParamsLong
Dim oParamsDouble As ParamDoubleCollection
oParamsDouble = corridorState.ParamsDouble
' Add the input parameters we use in this script
oParamsLong.Add(Utilities.Side, SideDefault)
oParamsLong.Add("InsertionPoint",
InsertionPointDefault)
oParamsLong.Add("CrownPtOnInside",
CrownPtOnInsideDefault)
oParamsDouble.Add("Width", LaneWidthDefault)
oParamsDouble.Add("Depth", LaneDepthDefault)
oParamsDouble.Add("Slope", LaneSlopeDefault)
oParamsLong.Add("TransitionType",
HoldOriginalPositionDefault)
End Sub
Protected Overrides Sub DrawImplement(ByVal
corridorState As CorridorState)
' Retrieve parameter buckets from the corridor
state
Dim oParamsDouble As ParamDoubleCollection
oParamsDouble = corridorState.ParamsDouble
Dim oParamsLong As ParamLongCollection
oParamsLong = corridorState.ParamsLong
Dim oParamsOffsetTarget As
ParamOffsetTargetCollection
www.EngineeringBooksPdf.com
oParamsOffsetTarget =
corridorState.ParamsOffsetTarget
Dim oParamsElevationTarget As
ParamElevationTargetCollection
oParamsElevationTarget =
corridorState.ParamsElevationTarget
'---------------------------------------------------------
' flip about Y-axis
Dim vSide As Long
Try
vSide = oParamsLong.Value(Utilities.Side)
Catch
vSide = SideDefault
End Try
Dim dFlip As Double
dFlip = 1.0#
If vSide = Utilities.Left Then
dFlip = -1.0#
End If
'---------------------------------------------------------
' Transition type
Dim vTransitionType As Long
Try
vTransitionType =
oParamsLong.Value("TransitionType")
Catch
vTransitionType = HoldOriginalPositionDefault
End Try
'---------------------------------------------------------
' Insertion Ponit
Dim vInsertionPoint As Long
Try
vInsertionPoint =
oParamsLong.Value("InsertionPoint")
Catch
vInsertionPoint = InsertionPointDefault
End Try
Dim vCrownPtOnInside As Long
Try
vCrownPtOnInside =
oParamsLong.Value("CrownPtOnInside")
Catch
vCrownPtOnInside = CrownPtOnInsideDefault
www.EngineeringBooksPdf.com
End Try
'---------------------------------------------------------
' BasicLaneTransition dimensions
Dim vWidth As Double
Try
vWidth = oParamsDouble.Value("Width")
Catch
vWidth = LaneWidthDefault
End Try
Dim vDepth As Double
Try
vDepth = oParamsDouble.Value("Depth")
Catch
vDepth = LaneDepthDefault
End Try
Dim vSlope As Double
Try
vSlope = oParamsDouble.Value("Slope")
Catch
vSlope = LaneSlopeDefault
End Try
'-------------------------------------------------------
' Get version, and convert values if necessary
Dim sVersion As String
sVersion = Utilities.GetVersion(corridorState)
If sVersion <> Utilities.R2005 Then
'need not change
Else
'R2005
'convert %slope to tangent value
vSlope = vSlope / 100
End If
Dim nVersion As Integer
nVersion = Utilities.GetVersionInt(corridorState)
If nVersion < 2010 Then
vCrownPtOnInside = Utilities.ITrue
End If
'---------------------------------------------------------
' Check user input
If vWidth <= 0 Then
Utilities.RecordError(corridorState,
CorridorError.ValueShouldNotBeLessThanOrEqualToZero,
"Width", "BasicLaneTransition")
www.EngineeringBooksPdf.com
vWidth = LaneWidthDefault
End If
If vDepth <= 0 Then
Utilities.RecordError(corridorState,
CorridorError.ValueShouldNotBeLessThanOrEqualToZero,
"Depth", "BasicLaneTransition")
vDepth = LaneDepthDefault
End If
' Calculate the current alignment and origin
according to the assembly offset
Dim oCurrentAlignmentId As ObjectId
Dim oOrigin As New PointInMem
Utilities.GetAlignmentAndOrigin(corridorState,
oCurrentAlignmentId, oOrigin)
'---------------------------------------------------------
' Define codes for points, links and shapes
Dim sPointCodeArray(0 To 4, 0) As String
Dim sLinkCodeArray(0 To 2, 0 To 1) As String
Dim sShapeCodeArray(0 To 1) As String
FillCodesFromTable(sPointCodeArray, sLinkCodeArray,
sShapeCodeArray, vCrownPtOnInside)
'---------------------------------------------------------
' Get alignment and profile we're currently working
from
Dim offsetTarget As WidthOffsetTarget 'width or
offset target
offsetTarget = Nothing
Dim elevationTarget As SlopeElevationTarget 'slope
or elvation target
elevationTarget = Nothing
Dim dOffsetToTargetHA As Double
Dim dOffsetElev As Double
If corridorState.Mode = CorridorMode.Layout Then
vTransitionType =
TransitionTypes.kHoldOffsetAndElevation
End If
Dim dXOnTarget As Double
Dim dYOnTarget As Double
Select Case vTransitionType
Case TransitionTypes.kHoldOffsetAndElevation
Case TransitionTypes.kHoldElevationChangeOffset
'oHA must exist
Try
www.EngineeringBooksPdf.com
offsetTarget =
oParamsOffsetTarget.Value("TargetHA")
Catch
'Utilities.RecordError(corridorState,
CorridorError.ParameterNotFound, "Edge Offset",
"BasicLaneTransition")
'Exit Sub
End Try
'get offset to targetHA
If False =
Utilities.CalcAlignmentOffsetToThisAlignment(oCurrentAlignmentId,
corridorState.CurrentStation, offsetTarget,
Utilities.GetSide(vSide), dOffsetToTargetHA, dXOnTarget,
dYOnTarget) Then
Utilities.RecordWarning(corridorState,
CorridorError.LogicalNameNotFound, "TargetHA",
"BasicLaneTransition")
dOffsetToTargetHA = vWidth +
oOrigin.Offset
Else
If (dOffsetToTargetHA = oOrigin.Offset)
Or ((dOffsetToTargetHA > oOrigin.Offset) And (vSide =
Utilities.Left)) Or _
((dOffsetToTargetHA <
oOrigin.Offset) And (vSide = Utilities.Right)) Then
Utilities.RecordWarning(corridorState,
CorridorError.ValueInABadPosition, "TargetHA",
"BasicLaneTransition")
dOffsetToTargetHA = vWidth +
oOrigin.Offset
End If
End If
Case TransitionTypes.kHoldGradeChangeOffset
'oHA must exist
Try
offsetTarget =
oParamsOffsetTarget.Value("TargetHA")
Catch
'Utilities.RecordError(corridorState,
CorridorError.ParameterNotFound, "Edge Offset",
"BasicLaneTransition")
'Exit Sub
End Try
www.EngineeringBooksPdf.com
'get offset to targetHA
If False =
Utilities.CalcAlignmentOffsetToThisAlignment(oCurrentAlignmentId,
corridorState.CurrentStation, offsetTarget,
Utilities.GetSide(vSide), dOffsetToTargetHA, dXOnTarget,
dYOnTarget) Then
Utilities.RecordWarning(corridorState,
CorridorError.LogicalNameNotFound, "TargetHA",
"BasicLaneTransition")
dOffsetToTargetHA = vWidth +
oOrigin.Offset
Else
If (((dOffsetToTargetHA >
oOrigin.Offset) And (vSide = Utilities.Left)) Or _
((dOffsetToTargetHA <
oOrigin.Offset) And (vSide = Utilities.Right))) Then
Utilities.RecordWarning(corridorState,
CorridorError.ValueInABadPosition, "TargetHA",
"BasicLaneTransition")
dOffsetToTargetHA = vWidth +
oOrigin.Offset
End If
End If
Case TransitionTypes.kHoldOffsetChangeElevation
'oVA must exist
Try
elevationTarget =
oParamsElevationTarget.Value("TargetVA")
Catch
'Utilities.RecordError(corridorState,
CorridorError.ParameterNotFound, "Edge Elevation",
"BasicLaneTransition")
'Exit Sub
End Try
Dim db As Database =
HostApplicationServices.WorkingDatabase
Dim tm As DBTransactionManager =
db.TransactionManager
Dim oProfile As Profile = Nothing
'get elevation on elevationTarget
Try
dOffsetElev =
elevationTarget.GetElevation(oCurrentAlignmentId,
www.EngineeringBooksPdf.com
corridorState.CurrentStation, Utilities.GetSide(vSide))
Catch
Utilities.RecordWarning(corridorState,
CorridorError.LogicalNameNotFound, "TargetHA",
"BasicLaneTransition")
dOffsetElev =
corridorState.CurrentElevation + vWidth * vSlope
End Try
Case TransitionTypes.kChangeOffsetAndElevation
'both oHA and oVA must exist
Try
offsetTarget =
oParamsOffsetTarget.Value("TargetHA")
Catch
'Utilities.RecordError(corridorState,
CorridorError.ParameterNotFound, "Edge Offset",
"BasicLaneTransition")
'Exit Sub
End Try
Try
elevationTarget =
oParamsElevationTarget.Value("TargetVA")
Catch
'Utilities.RecordError(corridorState,
CorridorError.ParameterNotFound, "Edge Elevation",
"BasicLaneTransition")
'Exit Sub
End Try
'get elevation on elevationTarget
Try
dOffsetElev =
elevationTarget.GetElevation(oCurrentAlignmentId,
corridorState.CurrentStation, Utilities.GetSide(vSide))
Catch
Utilities.RecordWarning(corridorState,
CorridorError.LogicalNameNotFound, "TargetHA",
"BasicLaneTransition")
dOffsetElev =
corridorState.CurrentElevation + vWidth * vSlope
End Try
'get offset to targetHA
If False =
Utilities.CalcAlignmentOffsetToThisAlignment(oCurrentAlignmentId,
www.EngineeringBooksPdf.com
corridorState.CurrentStation, offsetTarget,
Utilities.GetSide(vSide), dOffsetToTargetHA, dXOnTarget,
dYOnTarget) Then
Utilities.RecordWarning(corridorState,
CorridorError.LogicalNameNotFound, "TargetHA",
"BasicLaneTransition")
dOffsetToTargetHA = vWidth +
oOrigin.Offset
Else
If (dOffsetToTargetHA = oOrigin.Offset)
Or ((dOffsetToTargetHA > oOrigin.Offset) And (vSide =
Utilities.Left)) Or _
((dOffsetToTargetHA <
oOrigin.Offset) And (vSide = Utilities.Right)) Then
Utilities.RecordWarning(corridorState,
CorridorError.ValueInABadPosition, "TargetHA",
"BasicLaneTransition")
dOffsetToTargetHA = vWidth +
oOrigin.Offset
End If
End If
End Select
'---------------------------------------------------------
' Create the subassembly points
Dim corridorPoints As PointCollection
corridorPoints = corridorState.Points
Dim dX As Double
Dim dy As Double
dX = 0.0#
dy = 0.0#
Dim oPoint1 As Point
oPoint1 = corridorPoints.Add(dX, dy, "")
' compute outside position of lane
Select Case vTransitionType
Case TransitionTypes.kHoldOffsetAndElevation
' hold original position (always used in
layout mode)
dX = vWidth
dy = Abs(vWidth) * vSlope
Case TransitionTypes.kHoldElevationChangeOffset
' hold original elevation, move offset to
that of TargetHA
'dX = Abs(dOffsetToTargetHA -
www.EngineeringBooksPdf.com
corridorState.CurrentSubassemblyOffset)
dX = Abs(dOffsetToTargetHA - oOrigin.Offset)
dy = Abs(vWidth) * vSlope
Case TransitionTypes.kHoldGradeChangeOffset
' hold original grade, move offset to that
of TargetHA
' (also used if TargetVA is not defined)
'dX = Abs(dOffsetToTargetHA -
corridorState.CurrentSubassemblyOffset)
dX = Abs(dOffsetToTargetHA - oOrigin.Offset)
dy = Abs(dX) * vSlope
Case TransitionTypes.kHoldOffsetChangeElevation
' hold original offset, but change elevation
to that of TargetVA
dX = vWidth
'dY = dOffsetElev -
corridorState.CurrentSubassemblyElevation
dy = dOffsetElev - oOrigin.Elevation
Case TransitionTypes.kChangeOffsetAndElevation
' move position to that of TargetHA, and
elevation to that of TargetVA
dX = Abs(dOffsetToTargetHA - oOrigin.Offset)
dy = dOffsetElev - oOrigin.Elevation
End Select
'------------------------------------------------------------------
Dim dActualWidth As Double
dActualWidth = dX
Dim dActualSlope As Double
If 0 = dActualWidth Then
dActualSlope = 0.0#
Else
dActualSlope = dy / Abs(dActualWidth)
End If
'------------------------------------------------------------------
Dim oPoint2 As Point
oPoint2 = corridorPoints.Add(dX * dFlip, dy, "")
dX = dX - 0.001
dy = dy - vDepth
Dim oPoint3 As Point
oPoint3 = corridorPoints.Add(dX * dFlip, dy, "")
dX = 0.0#
dy = -vDepth
Dim oPoint4 As Point
www.EngineeringBooksPdf.com
oPoint4 = corridorPoints.Add(dX, dy, "")
If vInsertionPoint = InsertionPoint.kCrown Then
Utilities.AddCodeToPoint(1, corridorPoints,
oPoint1.Index, sPointCodeArray)
Utilities.AddCodeToPoint(2, corridorPoints,
oPoint2.Index, sPointCodeArray)
Utilities.AddCodeToPoint(3, corridorPoints,
oPoint3.Index, sPointCodeArray)
Utilities.AddCodeToPoint(4, corridorPoints,
oPoint4.Index, sPointCodeArray)
Else
Utilities.AddCodeToPoint(2, corridorPoints,
oPoint1.Index, sPointCodeArray)
Utilities.AddCodeToPoint(1, corridorPoints,
oPoint2.Index, sPointCodeArray)
Utilities.AddCodeToPoint(4, corridorPoints,
oPoint3.Index, sPointCodeArray)
Utilities.AddCodeToPoint(3, corridorPoints,
oPoint4.Index, sPointCodeArray)
End If
'---------------------------------------------------------
' Create the subassembly links
Dim oCorridorLinks As LinkCollection
oCorridorLinks = corridorState.Links
Dim oPoint(1) As Point
Dim oLink(3) As Link
oPoint(0) = oPoint1
oPoint(1) = oPoint2
oLink(0) = oCorridorLinks.Add(oPoint, "") 'L1
oPoint(0) = oPoint2
oPoint(1) = oPoint3
oLink(1) = oCorridorLinks.Add(oPoint, "") 'L2
oPoint(0) = oPoint3
oPoint(1) = oPoint4
oLink(2) = oCorridorLinks.Add(oPoint, "") 'L3
oPoint(0) = oPoint4
oPoint(1) = oPoint1
oLink(3) = oCorridorLinks.Add(oPoint, "") 'L4
Utilities.AddCodeToLink(1, oCorridorLinks,
oLink(0).Index, sLinkCodeArray)
Utilities.AddCodeToLink(2, oCorridorLinks,
oLink(2).Index, sLinkCodeArray)
'---------------------------------------------------------
www.EngineeringBooksPdf.com
' Create the subassembly shapes
Dim corridorShapes As ShapeCollection
corridorShapes = corridorState.Shapes
corridorShapes.Add(oLink, sShapeCodeArray(1))
'---------------------------------------------------------
'---------------------------------------------------------
' Write back all the Calculated values of the input
parameters into the RoadwayState object.
' Because they may be different from the default
design values,
' we should write them back to make sure that the
RoadwayState object
' contains the Actual information of the parameters.
oParamsLong.Add(Utilities.Side, vSide)
oParamsLong.Add("InsertionPoint", vInsertionPoint)
oParamsLong.Add("CrownPtOnInside", vCrownPtOnInside)
oParamsDouble.Add("Width", Math.Abs(dActualWidth))
oParamsDouble.Add("Depth", vDepth)
oParamsDouble.Add("Slope", dActualSlope)
oParamsLong.Add("TransitionType", vTransitionType)
End Sub
Protected Sub FillCodesFromTable(ByVal
sPointCodeArray(,) As String, ByVal sLinkCodeArray(,) As
String, ByVal sShapeCodeArray() As String, ByVal
CrownPtOnInside As Long)
If CrownPtOnInside = Utilities.ITrue Then
sPointCodeArray(1, 0) = Codes.Crown.Code
Else
sPointCodeArray(1, 0) = ""
End If
sPointCodeArray(2, 0) = Codes.ETW.Code
sPointCodeArray(3, 0) = Codes.ETWSubBase.Code 'P4
If CrownPtOnInside = Utilities.ITrue Then
sPointCodeArray(4, 0) = Codes.CrownSubBase.Code
'P3
Else
sPointCodeArray(4, 0) = "" 'P3
End If
sLinkCodeArray(1, 0) = Codes.Top.Code
sLinkCodeArray(1, 1) = Codes.Pave.Code
sLinkCodeArray(2, 0) = Codes.Datum.Code
sLinkCodeArray(2, 1) = Codes.SubBase.Code
sShapeCodeArray(1) = Codes.Pave1.Code
www.EngineeringBooksPdf.com
End Sub
End Class
Overview
An Autodesk tool catalog organizes groups of customized subassemblies and
makes them available to AutoCAD Civil 3D users. Autodesk tool catalogs are
defined using xml-formatted files with an .atc (Autodesk Tool Catalog)
extension. You also need to create a catalog registry file as catalogs must be
registered in the Windows registry. Some items within the .atc and registry
files must contain unique identifiers known as GUIDs (Global Unique
Identifiers). New GUIDs can be created using the GuidGen.exe utility that is
included with many Microsoft development products and is freely available
for download from the Microsoft web site.
1 Using Notepad or any other appropriate editor, create a plain ASCII text
file named <Name>Tools Catalog.atc, where <Name> is the name of this
new tool catalog. For information about the contents of the file, see
Creating a Tool Catalog ATC File (page 175).
NOTE
XML tags in ATC files are case-sensitive. Be sure that your tags match
the case of the tags described in this chapter.
2 Save the .atc file to the location where your tool catalogs are stored. The
default location is .
3 Create any optional files, such as images for icons displayed in the catalog
and help files for subassemblies, and place these files in appropriate
locations for reference.
4 Using Notepad or any other text editor, create a registry file for the tool
catalog with the extension .reg. For more information, see Creating a
Tool Catalog Registry File (page 186).
5 Register the tool catalog by double-clicking on the .reg file. Once
registered, the subassembly tool catalog will be displayed in the AutoCAD
Civil 3D Content Browser.
www.EngineeringBooksPdf.com
Creating a Tool Catalog ATC File
NOTE
XML tags in ATC files are case-sensitive. Make sure the tags in your files match
the case of the tags defined in this chapter.
1) <Catalog option="0">
2) <ItemID
idValue="{0D75EF58-D86B-44DF-B39E-CE39E96077EC}"/>
3) <Properties>
4) <ItemName resource="9250"
src="AeccStockSubassemblyScriptsRC.dll"/>
5) <Images option="0">
6) <Image cx="93" cy="123"
src=".\Images\AeccCorridorModel.png"/>
7) </Images>
8) <Description resource="9201"
src="AeccStockSubassemblyScriptsRC.dll"/>
9) <AccessRight>1</AccessRight>
10) <Time
createdUniversalDateTime="2003-01-22T00:31:56"
modifiedUniversalDateTime="2006-09-04T13:28:12"/>
11) </Properties>
12) <Source>
13) <Publisher>
14) <PublisherName>Autodesk</PublisherName>
www.EngineeringBooksPdf.com
15) </Publisher>
16) </Source>
17) <Tools/>
18) <Palettes/>
19) <Packages/>
20) <Categories>
21) <Category option="0">
22) <ItemID
idValue="{4F5BFBF8-11E8-4479-99E0-4AA69B1DC292}"/>
23) <Url href=".\\C3D Metric Getting Started
Subassembly Catalog.atc"/>
24) <Properties>
25) <ItemName resource="9212"
src="AeccStockSubassemblyScriptsRC.dll"/>
26) <Images option="0">
27) <Image cx="93" cy="123"
src=".\Images\AeccGenericSubassemblies.png"/>
28) </Images>
29) <Description resource="9213"
src="AeccStockSubassemblyScriptsRC.dll"/>
30) <AccessRight>1</AccessRight>
31) </Properties>
32) <Source/>
33) </Category>
34)
35) <!-- Other category items omitted -->
36)
37) </Categories>
38) <StockTools/>
39) <Catalogs/>
40) </Catalog>
1-40 The <Catalog> section contains the entire contents of the catalog
file.
2 This <ItemID> defines the GUID for the catalog. The same GUID
must be used in the registry file to identify this catalog.
www.EngineeringBooksPdf.com
Line Number Description
5-7 <Images> defines the image file for the icon that appears for the
catalog in the catalog browser. Images used for catalogs and sub-
assemblies should be a 64-by-64 pixel image. Valid image file types
include .bmp, .gif, .jpg, and .png.
10 <Time> defines the time and date the catalog was created in the
universal date/time format. This information is required, but not
used. Any date or time may be given.
21-33 Definition of the “Getting Started“ category. This block has been
designed to load all category information from a separate file. Cat-
egory information can also be placed within this file if you only want
one .atc file by using a <Category> section as described in the Tool
File Example (page 178)
22 <ItemID> defines the unique GUID for this category. It must be the
same GUID as in the separate category .atc file.
www.EngineeringBooksPdf.com
Line Number Description
1) <Category>
2) <ItemID
idValue="{4F5BFBF8-11E8-4479-99E0-4AA69B1DC292}"/>
3) <Properties>
4) <ItemName src="AeccStockSubassemblyScriptsRC.dll"
resource="9212"/>
5) <Images>
6) <Image cx="93" cy="123"
src=".\Images\AeccGenericSubassemblies.png"/>
7) </Images>
8) <Description
src="AeccStockSubassemblyScriptsRC.dll" resource="9213"/>
9) <AccessRight>1</AccessRight>
10) <Time
www.EngineeringBooksPdf.com
createdUniversalDateTime="2002-09-16T14:23:31"
modifiedUniversalDateTime="2004-06-17T07:08:09"/>
11) </Properties>
12) <CustomData/>
13) <Source/>
14) <Palettes/>
15) <Packages/>
16) <Tools>
17) <Tool>
18) <ItemID
idValue="{F6F066F4-ABF2-4838-B007-17DFDDE2C869}"/>
19) <Properties>
20) <ItemName resource="101"
src="AeccStockSubassemblyScriptsRC.dll"/>
21) <Images>
22) <Image cx="64" cy="64"
src=".\Images\AeccBasicBarrier.png"/>
23) </Images>
24) <Description resource="102"
src="AeccStockSubassemblyScriptsRC.dll"/>
25) <Keywords>_barrier subassembly</Keywords>
26) <Help>
27) <HelpFile>.\Help\C3DStockSubassemblyHelp.chm</HelpFile>
28) <HelpCommand>HELP_HHWND_TOPIC</HelpCommand>
29) <HelpData>SA_BasicBarrier.htm</HelpData>
30) </Help>
31) <Time
createdUniversalDateTime="2002-04-05T21:58:00"
modifiedUniversalDateTime="2002-04-05T21:58:00"/>
32) </Properties>
33) <Source/>
34) <StockToolRef
idValue="{7F55AAC0-0256-48D7-BFA5-914702663FDE}"/>
35) <Data>
36) <AeccDbSubassembly>
37) <GeometryGenerateMode>UseDotNet</GeometryGenerateMode>
38) <DotNetClass
Assembly=".\C3DStockSubassemblies.dll">Subassembly.BasicBarrier</DotNetClass>
39) <Resource
Module="AeccStockSubassemblyScriptsRC.dll"/>
40) <Content
DownloadLocation="http://www.autodesk.com/subscriptionlogin"/>
41) <Params>
www.EngineeringBooksPdf.com
42) <Version DataType="String"
DisplayName="Version" Description="Version">R2007</Version>
43) <TopWidth DataType="Double"
TypeInfo="16" DisplayName="105"
Description="106">0.15</TopWidth>
44) <MiddleWidth DataType="Double"
TypeInfo="16" DisplayName="107"
Description="108">0.225</MiddleWidth>
45) <CurbWidth DataType="Double"
TypeInfo="16" DisplayName="109"
Description="110">0.57</CurbWidth>
46) <BottomWidth DataType="Double"
TypeInfo="16" DisplayName="111"
Description="112">0.6</BottomWidth>
47) <TopHeight DataType="Double"
TypeInfo="16" DisplayName="113"
Description="114">0.9</TopHeight>
48) <MiddleHeight DataType="Double"
TypeInfo="16" DisplayName="115"
Description="116">0.45</MiddleHeight>
49) <CurbHeight DataType="Double"
TypeInfo="16" DisplayName="117"
Description="118">0.075</CurbHeight>
50) </Params>
51) </AeccDbSubassembly>
52) <Units>m</Units>
53) </Data>
54) </Tool>
55)
56) <!-- Other tool items omitted -->
57)
58) </Tools>
59) <StockTools/>
60) </Category>
2 <ItemID> defines the unique GUID for this category. It must be the
same GUID as in the parent catalog .atc file.
www.EngineeringBooksPdf.com
Line Number Description
www.EngineeringBooksPdf.com
Line Number Description
31 <Time> defines the time and date the catalog was created in the
universal date/time format. This information is required, but not
used. Any date or time may be given.
38 <DotNetClass> is a new tag that lists the .NET assembly and class
which contains the subassembly. The VBA equivalent is the <Macro>
tag. Note that all paths specified in the ATC file must be relative
paths to the ATC file itself.
39 The .dll containing the resource strings and images used by the
subassembly tool.
www.EngineeringBooksPdf.com
Line Number Description
41-50 <Params> defines the names of the input parameters associated with
the subassembly tool. This list appears in the Properties page of the
subassembly, in the order they appear in the .atc file. Each parameter
is defined on a single line.
www.EngineeringBooksPdf.com
Data Type Type String Description
www.EngineeringBooksPdf.com
Data Types Type String Description
www.EngineeringBooksPdf.com
.html file is specified within the .atc file. This file is usually placed in the same
directory as the .atc files themselves.
1) REGEDIT4
2)
3) [HKEY_CURRENT_USER\Software\Autodesk\Autodesk Content
Browser\60]
4)
5) [HKEY_CURRENT_USER\Software\Autodesk\Autodesk Content
Browser\60\RegisteredGroups]
6)
7) [HKEY_CURRENT_USER\Software\Autodesk\Autodesk Content
Browser\60\RegisteredGroups\Roads Group]
8) "ItemID"="{5BD79109-BC69-41eb-9AC8-7E9CD469C8D3}"
9) "ItemName"="Roads Group"
10)
11)
12) [HKEY_CURRENT_USER\Software\Autodesk\Autodesk Content
Browser\60\RegisteredCatalogs]
13)
14) [HKEY_CURRENT_USER\Software\Autodesk\Autodesk Content
Browser\60\RegisteredCatalogs\Autodesk Civil 3D Imperial
Corridor Catalog]
15) "ItemID"="{410D0B43-19B3-402f-AB41-05A6E174AA3F}"
16) "Image"=".\\Images\\AeccRoadway.png"
17) "Url"="C:\\Documents and Settings\\All
Users\\Application Data\\Autodesk\\C3D2010\\enu\\Tool
Catalogs\\Road Catalog\\Autodesk Civil 3D Imperial Corridor
Catalog.atc"
18) "DisplayName"="Civil 3D Subassemblies (Imperial Units)"
www.EngineeringBooksPdf.com
19) "Description"="Imperial Units Subassemblies"
20) "Publisher"="Autodesk"
21) "ToolTip"="Autodesk Civil 3D Imperial Corridor Catalog"
22) "GroupType"="{5BD79109-BC69-41eb-9AC8-7E9CD469C8D3}"
23)
24)
25) [HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18\ACAD-8000:409\AEC\60\General\Tools]
26) "ToolContentRoot"="C:\\Documents and Settings\\All
Users\\Application Data\\Autodesk\\C3D2010\\enu\\Tool
Catalogs\\Road Catalog"
3-9 These statements create a Group for the Autodesk Content Browser.
The group id name is “Roads Group”. Each group must have a unique
GUID for the “ItemID”. The Roads Group is already registered by
the AutoCAD Civil 3D installation. If you are adding a catalog to this
group, you should use the GUID shown in the example.
15 “ItemId” must be a unique GUID for this catalog. This must match
the GUID for the Catalog ItemID value in the catalog .atc file.
16 “Image” must be a unique GUID for this catalog. This must match
the GUID for the Catalog ItemID value in the catalog .atc file.
www.EngineeringBooksPdf.com
Line Number Description
21 “ToolTip” – the text that displays for the tooltip when the cursor is
hovered over the tool catalog in the Catalog Browser.
22 “GroupType” – the GUID that defines which the tool catalog belongs
to in the Catalog Browser. This GUID must match the one used for
the “ItemID” in the group definition.
NOTE
It’s simpler to create a subassembly package file to distribute to users than to
install custom subassemblies manually. See Exporting Subassemblies Using a
Package File (page 189).
www.EngineeringBooksPdf.com
about creating cover pages, see Creating a Tool Catalog Cover Page (page
185).
5 Register the tool catalog using a registry (.reg) file. This .reg file must have
the correct paths to the .atc file and the catalog image file from steps 2)
and 3). For information about creating registry files, see Creating a Tool
Catalog Registry File (page 186)
NOTE
Subassemblies created from polylines cannot be included in a package file.
Package files are intended for sharing custom subassemblies that have been
created using .NET or VBA.
If you are sharing a single subassembly, it is recommended that you name the
package file the same name as the subassembly. For example, if you plan to
export a subassembly named OpenChannel, name the package file
OpenChannel.pkt. If you plan to export multiple subassemblies in a single
www.EngineeringBooksPdf.com
package file, give the folder a name that easily identifies the types of
subassemblies that are contained in it. For example, DitchSubassemblies.pkt.
The following table describes the files that must be included in a package file
to successfully export and import one or more subassemblies.
File Description
.atc file(s) A valid .atc file that defines the shape and behavior of the subassembly or sub-
assemblies is required. You can have one or more .atc files included in the
package file. For example, you can have one .atc file that defines one or more
subassemblies, or you can have multiple .atc files, each of which defines one or
more subassemblies. If the package file contains multiple .atc files, each .atc file
must have a unique name. All the paths referenced in .atc file must be relative
paths, if they point to files in the same .pkt file.
.dll or .dvb file(s) A .dll file is required for subassemblies that are defined using .NET. A .dvb file
is required for subassemblies that are defined using VBA. A package file can
contain both .dll and .dvb files.
Help file(s) A Help file is not required in order for a subassembly to function properly.
However, the Help file is needed for others to understand how to use the sub-
assembly. Therefore, it is recommended that you always include a Help file with
each subassembly. The Help file for each subassembly is specified in the .atc file,
and can be any of the following formats: .dwf, .doc, .pdf, .txt, .chm, .hlp. For
more information, see Creating Subassembly Help Files (page 152).
Image file(s) An image file for each is displayed on the tool palette and is used to provide a
conceptual graphical representation of the subassembly shape.
1 Copy all of the required subassembly files into a folder. Make sure that
folder contains only the files required for the subassembly or
subassemblies you plan to export.
2 Create a .zip file of the contents of that folder.
www.EngineeringBooksPdf.com
3 Change the file extension from .zip to .pkt.
The package (.pkt) file is created and can be shared with other users.
Procedure
This section describes the steps required to convert a VBA subassembly to
VB.NET. Although this procedure only describes converting the subassembly
to VB.NET, you can use a similar approach to convert the subassembly to
another .NET language, such as C#.
Where applicable, a regular expression is suggested to automate some of the
changes required. In most cases, using regular expressions can reduce the time
required to port a custom subassembly. See the MSDN help topic on Regular
Expressions and Replace in Files for more information.
www.EngineeringBooksPdf.com
use the Visual Studio "Class Library" template, and should reference the
following files:
■ acdbmgd.dll
■ acmgd.dll
■ AecBaseMgd.dll
■ AeccDbMgd.dll
www.EngineeringBooksPdf.com
Copy Subassembly Code
Copy the original code from the VBA module (*.bas) to the corresponding
place in the new class:
From To
UserdefinedSA_GetLogicalNames() GetLogicalnamesImplement()
UserdefinedSA() DrawImplement()
www.EngineeringBooksPdf.com
■ Autodesk.Civil.Land.Settings
■ Autodesk.Civil.Roadway
■ Autodesk.Civil.Roadway.DatabaseServices
■ Autodesk.Civil.Roadway.Settings
■ Autodesk.Civil.Runtime
■ Autodesk.Civil.Settings
Regular expression:
■ Find: On Error{.*}
■ Leave the Replace field blank if you want to delete these statements. Use
' On Error\1 if you only want to comment them out.
Remove all the Exit Sub and Error Handler: statements at the end of each
subroutine. In VBA, you may see following code at the end of each subroutine
- remove it, or move it into the appropriate Catch statement when converting
error handling logic in step 14.
Exit Sub
ErrorHandler:
RecordError Err.Number, Err.Description, Err.Source
Regular expression:
■ Find: Exit Sub{ *}\n{ *}\n{ *}ErrorHandler\:{ *}\n{
*}RecordError.+{ *}\n{ *}{End Sub}
■ Replace: \8
www.EngineeringBooksPdf.com
' Get the roadway state object
Dim oRwyState As AeccRoadwayState
Set oRwyState = GetRoadwayState()
The corridorState object is already passed in by the argument of the
subroutine, so it is not necessary to get it yourself.
Regular expression:
■ Find: {'.*}{ *}\n{ +}Dim.+As AeccRoadwayState{ *}\n{ *}.+=
GetRoadwayState\(\)
Regular expression:
■ Find: oRwyState
■ Replace: corridorState
In VBA, the parameter Value() method returns null if the key does not exist.
In the .NET API, the same code will throw an exception. Where you access a
parameter, you need to use a Try / Catch block to catch this case:
' VBA:
vCutSlope = oParamsDouble.Value("CutSlope")
If IsEmpty(vCutSlope) Then vCutSlope = c_dCutSlopeDefault
This code can be changed to:
' .NET:
Try
vCutSlope = oParamsDouble.Value("CutSlope ")
Catch
vCutSlope = c_ dCutSlopeDefault
End Try
www.EngineeringBooksPdf.com
Regular expression:
■ Find: ^{.+ =.+\.Value\(.+\)}\n{ +}If IsEmpty.+Then{.+}
■ Replace: Try\n\1\nCatch\n\3\nEnd Try\n
' VBA:
RecordError(aeccRoadwayErrorValueTooLarge,
"RoundingTesselation", "DaylightBench")
Change to:
'.NET:
Utilities.RecordError(corridorState,
CorridorError.ValueTooLarge, "RoundingTesselation",
"DaylightBench")
Regular expression:
■ Find: {Record}{Warning|Error}{\(}{aecc}{RoadwayError}
■ Replace: Utilities.Record\2\3roadwayState,RoadwayError.
In VBA subassembly code, you will see global variables such as g_iRight,
g_sSide, which have a "g_" prefix. Most of these global variables have been
moved to the Utilities class and renamed.
The following table lists some commonly used global variables and their
corresponding ones in the Utilities class. Refer to the definition of the
Utilities class for more information.
From To
g_sSide Utilities.Side
g_iLeft Utilities.Left
www.EngineeringBooksPdf.com
From To
g_iRight Utilities.Right
g_iTrue Utilities.ITrue
Rounding_Option.NoneType Utilities.RoundingOption.None-
Type
CutSituation Utilities.FillOrCut.FillSitu-
ation
SubbaseType Utilities.ShoulderSubbase-
Type.Subbase
In VBA subassembly code, nearly all the COM enumerations have an "aecc"
prefix, such as aeccParamLogicalNameTypeAlignment. Replace them with
corresponding .NET enumerations.
As a rule, the corresponding .NET enumerations are named by removing the
"aecc" prefix and making the detail category a child member. For example,
aeccParamLogicalNameTypeAlignment becomes
ParamLogicalNameType.Alignment.
The following table lists some commonly used COM enumerations and their
corresponding .NET enumerations.
From To
aeccParamLogicalNameTypeAlign- ParamLogicalNameType.Alignment
ment
aeccRoadwayModeLayout CorridorMode.Layout
aeccParamAccessOutput ParamAccessType.Output
www.EngineeringBooksPdf.com
Step 10: Rename types
From To
IAeccParamsDouble ParamDoubleCollection
IAeccRoadwayLinks LinkCollection
IAeccParam Param
AeccRoadwayLink Link
AeccParamLong ParamLong
Regular expressions:
www.EngineeringBooksPdf.com
These four regular expressions do not cover all the required changes, so you
will have to make additional changes manually.
Remove the g_All, g_s and s prefixes in each variable name to match the new
convention for code names.
From To
g_AllCodes.g_sHinge_Cut.sCode Codes.HingeCut.Code
g_AllCodes.g_sDaylight.sCode Codes.Daylight.Code
g_AllCodes.g_sDaylight_Cut.sCode Codes.DaylightCut.Code
Regular expression:
■ Find: g_All{Codes\.}g_s{.+\.}s{.+}
■ Replace: \1\2\3
www.EngineeringBooksPdf.com
Step 13: Update array definitions
In VBA, many arrays are defined with a lower bound at index “1”. This is not
allowed in .NET, so you should modify their definitions.
In most situations, you can just modify the array definition do not need to
make any other changes. The array element 0 is defined but left unused.
' VBA:
On Error Resume Next
Dim oTargetDTM As IAeccSurface
Set oTargetDTM = oParamsSurface.Value("TargetDTM")
If oTargetDTM Is Nothing Then
' Error handling code goes here
Exit Sub
End If
On Error GoTo ErrorHandler
Change error handling to:
' .NET:
Dim oTargetDTMId As ObjectId
Try
oTargetDTMId = oParamsSurface.Value("TargetDTM")
Catch
' Error handling code goes here
www.EngineeringBooksPdf.com
Exit Sub
End Try
In the COM API, the arguments and return values all refer to a database object
instance. However, in the .NET API, arguments and return values are the
ObjectId of the database object, not the object itself.
' VBA:
Dim oTargetDTM As IAeccSurface
Set oTargetDTM = oParamsSurface.Value("TargetDTM")
In .NET this would be:
' .NET:
Dim oTargetDTMId As ObjectId
Try
oTargetDTMId = oParamsSurface.Value("TargetDTM")
Catch
End Try
Then, to use the database object's instance, you have to use
TransactionManager.GetObject() to open the database object.
' VBA:
Dim oCurrentAlignment As AeccAlignment
GetAlignmentAndOrigin(oRwyState, oCurrentAlignment, oOrigin)
In .NET:
' .NET:
Dim currentAlignmentId As ObjectId
Dim currentAlignment As Alignment
Utilities.GetAlignmentAndOrigin(corridorState,
currentAlignmentId, origin)
' ...
Dim db As Database =
Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase
Dim tm As
Autodesk.AutoCAD.DatabaseServices.TransactionManager =
db.TransactionManager
www.EngineeringBooksPdf.com
currentAlignment = tm.GetObject(currentAlignmentId,
OpenMode.ForRead, false, false)
Final Adjustments
The above rules cover the majority of changes needed to convert VBA code
to working Visual Basic .NET code. Depending on the nature of your
subassembly, there may still be some syntax errors.
NOTE
DataLocation in the path above depends on the operating system:
■ On Windows XP it is C:\Documents and Settings\All Users\Application Data\
■ On Windows Vista and Windows 7, it is C:\ProgramData\Autodesk\
The .atc file format for .NET subassemblies is largely the same as for VBA
subassemblies except that two new tags are used:
<GeometryGenerateMode>UseDotNet</GeometryGenerateMode>
<GeometryGenerateMode> tells Civil 3D that you are using a .NET subassembly.
It is placed within the <Tool> tag.<DotNetClass
Assembly="%AECCCONTENT_DIR%\C3DStockSubassemblies.dll">Subassembly.NewCurb</DotNetClass>
<DotNetClass> is used instead of <Macro> tag when using .NET subassemblies
www.EngineeringBooksPdf.com
subassembly is located, the name of the .NET subassembly. Finally it sets the
subassembly GeometryGenerator parameter to the new SubassemblyGenerator.
When the transaction is committed, the subassembly is replaced.
[CommandMethod("ConvertVbaSA")]
public void ConvertVbaSA()
{
using(Transaction trans =
m_transactionManger.StartTransaction())
{
ObjectId saId =
Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument.SubassemblyCollection["VBASubassembly"];
Subassembly sa = trans.GetObject(saId,
OpenMode.ForWrite) as Subassembly;
SubassemblyGenerator genData = new
SubassemblyGenerator(SubassemblyGeometryGenerateMode.UseDotNet,
"C3DStockSubassemblies.dll",
"Subassembly.DotNetSubassembly");
sa.GeometryGenerator = genData;
trans.Commit();
}
}
www.EngineeringBooksPdf.com
NOTE
VBA support is not included with AutoCAD Civil 3D by default, and must be
obtained as a separate download.
VBA projects are usually stored in separate .dvb files, which allow macros to
interact with many separate AutoCAD Civil 3D drawings.
Root Objects
This section explains how to acquire references to the base objects which are
required for all applications using the COM API. It also explains the uses of
the application, document, and database objects and how to use collections,
which are commonly used throughout the COM API.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
' Now we can use the AeccApplication object.
' Get the AeccDocument representing the currently
' active drawing.
Dim oDocument As AeccDocument
Set oDocument = oCivilApp.ActiveDocument
' Set the viewport of the current drawing so that all
' drawing elements are visible.
oCivilApp.ZoomExtents
This sample gets the objects from AutoCAD Civil 3D 2009. To gain access to
the libraries of an older version, use the version number of the desired libraries
to the COM object name. For example, to make a program that works with
AutoCAD Civil 3D 2007, replace:
www.EngineeringBooksPdf.com
Set oPointStyle = oAeccDocument.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.
oPointStyle.Elevation = 114.6
If you attempt to add a new element with properties that match an already
existing element, try to access an item that does not exist, or remove an item
that does not exist or is in use, an error will result. You should trap the error
and respond accordingly.
The following sample demonstrates one method of dealing with such errors:
www.EngineeringBooksPdf.com
dPoints(0) = 1000: dPoints(1) = 1000: dPoints(2) = 0
dPoints(3) = 1000: dPoints(4) = 4000: dPoints(5) = 0
dPoints(6) = 4000: dPoints(7) = 4000: dPoints(8) = 0
' The database is where all such objects are stored.
Set oPolyline =
oDocument.Database.ModelSpace.AddPolyline(dPoints)
oPolyline.Closed = True
The AeccDatabase object also has an AddEvent() method, that lets you send
an event to the Event Viewer in the AutoCAD Civil 3D user interface:
Ambient Settings
This section explains the purpose and use of the document settings objects,
and covers changing general and specific settings.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
are accessed through the properties of the AeccSettingsRoot object, which is
obtained from the AeccDocument.Settings property. There are settings for
objects and commands. The object properties define the settings for items in
general, or of particular classes of items, such as alignments, gradings, parcels,
points, profiles, profile views, sample lines, sections, section views, and surfaces.
Although each of these objects are unique, they all share some common
features:
www.EngineeringBooksPdf.com
' Units are displayed in gradians
End If
Label Styles
This section explains common features of label styles. It covers creating a new
label style object, defining a label style, and using property fields in label style
text strings. Details specific to each construct are covered in the appropriate
chapters.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
The following example creates a new label style object that can be used with
points:
www.EngineeringBooksPdf.com
oLabelStyleLineComponent.StartPointXOffset = 0.005
oLabelStyleLineComponent.StartPointYOffset = -0.005
When first created, the label style object is set according to the ambient
settings. Because of this, a new label style object may already contain features.
If you are creating a new label style object, be sure to check for such existing
features or your style might contain unintended elements.
www.EngineeringBooksPdf.com
oTextComponent.Contents = "SPD=<[Design
Speed(P0|RN|AP|Sn)]>"
oTextComponent.Contents = oTextComponent.Contents & _
"STA=<[Station Value(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>"
Valid property fields for each element are listed in the appropriate chapter.
www.EngineeringBooksPdf.com
Survey in COM
Object Hierarchy
www.EngineeringBooksPdf.com
Survey Object Model
Root Objects
This section describes how to gain access to the survey-specific versions of the
root document and database objects. It covers the use of ambient settings,
user settings, and the equipment database. It also describes the creation of
survey projects, which contain networks and figures, and provide access to
survey points.
www.EngineeringBooksPdf.com
Changing Survey-Specific Ambient Settings
Ambient settings for a survey document are held in the
AeccSurveyDocument.Settings property, an object of type
AeccSurveySettingsRoot. AeccSurveySettingsRoot inherits all the properties
of the AeccSettingsRoot class from which it is derived. Ambient settings allow
you to get and set the units and default property settings of survey objects.
This is done through the AeccSurveySettingsRoot.SurveySettings, which
contains a standard AeccSettingsAmbient object.
www.EngineeringBooksPdf.com
' Save the changes to the user settings object.
oSurveyDocument.UpdateUserSettings oUserSettings
www.EngineeringBooksPdf.com
Debug.Print " Circle Standard: "; .CircleStandard
Debug.Print " Coordinate Std: "; .CoordinateStandard
Debug.Print " Distance Unit: "; .DistanceUnit
Debug.Print " Edm Error: "; .EdmMmError; "mm"
Debug.Print " Edm Error: "; .EdmPpmError; "ppm"
Debug.Print " Edm Offset: "; .EdmOffset
Debug.Print " Elevation Std: "; .ElevationStandard
Debug.Print " H Collimation: "; .HorizontalCollimation
Debug.Print " Is Prism Tilted: "; CStr(.IsTiltedPrism)
Debug.Print " Measuring Device: "; .MeasuringDevice
Debug.Print " Pointing Std: "; .PointingStandard
Debug.Print " Prism Constant: "; .PrismConstant
Debug.Print " Prism Offset: "; .PrismOffset
Debug.Print " Prism Std: "; .PrismStandard
Debug.Print " Revision: "; .Revision
Debug.Print " Target Std: "; .TargetStandard
Debug.Print " Theodolite Std: "; .TheodoliteStandard
Debug.Print " Vertical Angle Type: ";
.VerticalAngleType
Debug.Print " V Collimation: "; .VerticalCollimation
Debug.Print
End With
Next
Next
www.EngineeringBooksPdf.com
' Print the next available survey point Id available.
Debug.Print "Next available Id:"; _
oSurveyProject.GetNextWritablePointNumber()
www.EngineeringBooksPdf.com
included in a surface definition. User-defined extended properties can be used
to define additional attributes beyond those defined by the LandXML schema.
For an example of standard LandXML extended properties, see the
C:\Documents and Settings\All Users\Application
Data\Autodesk\C3D2012\enu\Survey\LandXML - Standard.sdx_deffile.
The AeccSurveyFigure, AeccSurveyNetwork, AeccSurveyPoint, and
AeccSurveyProject objects each have a LandXMLXPropertiesRoot property,
which gives you access to the AeccSurveyLandXMLXPropertiesRoot for that
object. Those objects also each have a UserDefinedXProperties object, which
gives you access to the AeccSurveyUserDefinedXProperties for that object.
Survey Network
A network represents the spatial framework of a survey. Each network contains
a collection of control points, directions, setups, and non-control points. It
also contains information on how these objects are related, such as how the
control points and setups are connected relative to one another.
www.EngineeringBooksPdf.com
Dim oControlPoints As AeccSurveyControlPoints
Set oControlPoints = oSurveyNetwork.ControlPoints
www.EngineeringBooksPdf.com
0.785398163, _
aeccSurveyDirectionTypeAzimuth)
This sample creates a setup at the location of point 3001 using the location
of point 3004 as the backsight. It then creates an observation to another
location, which is given the identification “3002”.
www.EngineeringBooksPdf.com
' On setup "Station:3001, Backsight:3004" create an
observation
' of point 3002.
' Angle = 90 degrees (1.57079633 radians)
' Angle Type = Angle
' Distance = 100#
' Distance Type = Slope
' Vertical = 90 degrees (1.57079633 radians)
' Vertical Type = Vertical Angle
' Target Height = 0#
' Target Type = Prism
Set oObservation1 = oObservations.Create( _
3002, _
aeccSurveyAngleTypeAngle, _
1.57079633, _
aeccSurveyDistanceTypeSlope, _
100#, _
aeccSurveyVerticalTypeVerticalAngle, _
1.57079633, _
aeccSurveyTargetTypePrism, _
0#, _
"From setup <Station:3001, Backsight:3004> to Point 3002")
www.EngineeringBooksPdf.com
' the location 4950.0, 5000.0, elevation 100.0.
Dim oNonControlPt As AeccSurveyNonControlPoint
Set oNonControlPt = oSurveyNetwork.NonControlPoints.Create(
_
3006,
"NonControlPoint_01",
"Description of non-control point",
4950#,
5000#,
100#)
A non-control point may be promoted to a control point if you reference the
point as a control point when creating a traverse, or reference the point as a
setup to make observations to other points that may affect locations during
an analysis.
www.EngineeringBooksPdf.com
3001, _
3004, _
3001, _
lStations)
oSurveyNetwork.AddToDrawing
www.EngineeringBooksPdf.com
Figures
Figures are a group of connected lines and arcs that have meaning within a
survey. A figure can represent a fence, building, road, parcel, or similar object.
Unlike a normal polyline, a vertex in a figure can reference a survey point. If
a referenced survey point is moved, vertices in the figure are moved as well.
The first line or arc added to the figure sets the location all other lines and
arcs will be drawn from. Each line and arc added to a figure is in turn based
on the endpoint of the previous element. The position of the last endpoint
can be determined from the read-only properties
AeccSurveyFigure.LastPointX and AeccSurveyFigure.LastPointY.
AddLineByPoint
www.EngineeringBooksPdf.com
oFigure.AddLineByPoint oPoint1.Easting, oPoint1.Northing,
3001
AddLineByAzimuthDistance
AddLineByDeltaAzimuthDistance
www.EngineeringBooksPdf.com
Adding Figures to the Drawing
Adding lines and arcs to a figure changes the survey database but does not
automatically change the drawing. After you are done adding elements to the
figure, call the AeccSurveyFigure.AddToDrawing method to create AutoCAD
elements that correspond to the figure. This is equivalent to the AutoCAD
Civil 3D command “Insert Into Drawing”.
www.EngineeringBooksPdf.com
AeccSurveyFigureStyle.AdditionalMarkersPlacementMethod property. If the
placement method is set for interval placement, then a new marker is placed
every n units apart where n is the value of the
AeccSurveyFigureStyle.AdditionalMarkersInterval property. If the
placement method is set for divided placement, then the figure is divided into
n parts of equal length where n is the value of the
AeccSurveyFigureStyle.AdditionalMarkersDivideFigureBy property. A
marker is placed at each part, including the figure start and end points. If the
placement method is set for continuous, then the markers are placed exactly
one marker’s width apart along the length of the figure.
You can determine the style of figure drawing by examining the
FigureDisplayMode property. There are three ways a figure can be visualized:
using figure elevations, flattening the figure to a single elevation, or
exaggerating figure elevations. If the figure is flattened to a single elevation,
the elevation can be read from the FlattenFigureElevation property. If the
figure elevations are exaggerated when displayed, the amount of exaggerations
is held in the read-only FigureElevationScaleFactor property.
All figure styles are stored in the AeccSurveyDocument.FigureStyle collection.
The figure object’s AeccSurveyFigure.Style property takes the string name
of the style to use.
This sample creates a new figure style object and adjusts some of the style
settings:
www.EngineeringBooksPdf.com
Using the Figure Prefix Database
A figure read from a fieldbook file can have a letter prefix signifying what
object or concept the figure represents. This figure prefix describes the style
and property settings to use with the figure. A list of figure prefixes is stored
in AeccSurveyFigurePrefixDatabase objects. The collection of all databases
in the document are stored in the AeccSurveyDocument.FigurePrefixDatabases
property. New figure prefixes and databases are added through the parent
collection’s Create method. Once a prefix or database is created, it becomes
a permanent part of the figure prefix database and it is not lost upon loading
a new document or running a new instance of AutoCAD Civil 3D. Because of
this, it is important to check for existing prefix databases and prefixes by name
before trying to create new ones. The
AeccSurveyFigurePrefixDatabases.FindItem method can be used to search
for an existing database id or name.
NOTE
The similarly named AeccSurveyFigurePrefixDatabase.FindItem can only
be used to search for the identification numbers of prefixes within a database
- to find a prefix by name, use the
AeccSurveyFigurePrefixDatabase.GetMatchedFigurePrefix method.
This sample creates a new figure prefix database and a new figure prefix. It
switches the current database to the newly created one, and sets an existing
figure to use the new prefix’s style.
www.EngineeringBooksPdf.com
On Error Resume Next
Set oSurveyFigurePrefix = _
oPrefixDatabase.GetMatchedFigurePrefix("BV")
On Error GoTo 0
If (oSurveyFigurePrefix Is Nothing) Then
Set oSurveyFigurePrefix = oPrefixDatabase.Create("BV")
End If
oUserSettings.CurrentFigurePrefixDatabase = "NewDB"
oSurveyDocument.UpdateUserSettings oUserSettings
Sample Program
SurveySample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Survey\SurveySample.dvb
www.EngineeringBooksPdf.com
This sample creates a simple survey from hard-coded data using control points,
setups, directions, and figures. A survey style is created and applied. The
ambient settings and other global settings are demonstrated.
Points in COM
Object Hierarchy
Points
This section covers the collection of all points in a document, accessing points
stored in a file, and the use of the point object.
www.EngineeringBooksPdf.com
Using the Points Collection
All points in a document are held in the AeccDocument.Points property, an
object of type AeccPoints. Besides the usual collection properties and methods,
the Points object also has methods for dealing with large numbers of points
at once. An array of positions can be added using the AeccPoints.AddMultiple
method.
The following example adds a series of points to the AeccDocument.Points
collection using AddMultiple and then accesses points in the collection directly:
www.EngineeringBooksPdf.com
Accessing Points in a File
The AeccPoints object also has methods for reading and writing point locations
in a file. The AeccPoints.ImportPoints method creates points from locations
stored in a text file. The AeccPoints.ExportPoints method writes point
locations to a text file.
The second parameter of the ImportPoints and ExportPoints methods is a
string that describes how the point values are stored in the file. The following
table lists some commonly available file formats. You can create other formats
by using the Point File Format dialog box.
Point File Formats
www.EngineeringBooksPdf.com
String Literal Format of values in the file
www.EngineeringBooksPdf.com
NOTE
When you add points using the ImportPoints method, it is possible that the
point numbers will conflict with those that already exist in the drawing. In
such cases, the user is given an option to renumber the point numbers from
the file, or to cancel the operation which will result with a Visual Basic error.
An application that uses ImportPoints should take this into account.
Using Points
Each individual point is represented by an object of type AeccPoint. The point
object contains the identification number, description, and location for the
point. The identification number, held in the Point.Number property, is unique
and is automatically assigned when the point is first created. It cannot be
changed. The read-only Point.FullDescription property is only meaningful
when the point is read from a file that contains description information.
You can access the local position through either the AeccPoint.Easting and
AeccPoint.Northing properties or by using the AeccPoint.Location property,
a three-element array containing the easting, northing, and elevation. The
point’s location can also be specified by using the AeccPoint.Grideasting
and AeccPoint.GridNorthing properties or the AeccPoint.Latitude and
AeccPoint.Longitude properties, depending on the coordinate settings of the
drawing.
This sample adds a new point to the document’s collection of points and sets
some of its properties.
www.EngineeringBooksPdf.com
Point User-Defined Properties
Point objects can have user-defined properties associated with them, and the
properties can be organized into user-defined classifications, or are put into
an “Unclassified” classification. You can create new classifications and
user-defined properties via the API, though you can’t access the values of
existing user-defined properties attached to points. For more information
about user-defined properties and classifications, see User-Defined Property
Classifications in the .
This sample creates a new user-defined property classification for points called
“Example”, and then adds a new user-defined property with upper and lower
bounds and a default value:
Style
This section covers the creation of point styles and point-specific features of
the point label style object. It also explains point description keys, which are
used to assign styles to points read from a text file.
www.EngineeringBooksPdf.com
Creating Point Styles
A point style is a group of settings that define how a point is drawn. These
settings include marker style, marker color and line type, and label color and
line type. Point objects can use any of the point styles that are currently stored
in the document. Styles are assigned to a point through the point’s
AeccPoint.Style property. Existing point styles are stored in the document’s
AeccDocument.PointStyles property.
You can also create custom styles and add them to the document’s collection
of point styles. First, add a new style to the document’s list of styles using the
AeccDocument.PointStyles.Add method. This method returns a new style
object that is set with all the properties of the default style. You can then make
the changes to the style object you require.
This sample creates a new points style, adjusts the style settings, and the assigns
the style to point “Point1”:
www.EngineeringBooksPdf.com
Creating Point Label Styles
Any text labels or graphical markers displayed at the point location are set by
assigning a label style object to the AeccPoint.LabelStyle property. The
collection of these label styles is accessed through the
AeccDocument.PointLabelStyle property.
Point label styles can use the following property fields in the contents of any
text components:
<[Name(CP)]>
<[Point Number]>
<[Northing(Uft|P4|RN|AP|Sn|OF)]>
<[Easting(Uft|P4|RN|AP|Sn|OF)]>
<[Raw Description(CP)]>
<[Full Description(CP)]>
<[Point Elevation(Uft|P3|RN|AP|Sn|OF)]>
<[Latitude(Udeg|FDMSdSp|P6|RN|DPSn|CU|AP|OF)]>
<[Longitude(Udeg|FDMSdSp|P6|RN|DPSn|CU|AP|OF)]>
<[Grid Northing(Uft|P4|RN|AP|Sn|OF)]>
<[Grid Easting(Uft|P4|RN|AP|Sn|OF)]>
<[Scale Factor(P3|RN|AP|OF)]>
<[Convergence(Udeg|FDMSdSp|P6|RN|AP|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccLabelStyleTextComponent.Contents
<[Survey Point]>
Label styles are described in detail in the chapter 1 section Label Styles (page
211).
' Create a new key in the set we just made. Match with
' any description beginning with "SMP".
Dim oPointDescriptionKey As AeccPointDescriptionKey
Set oPointDescriptionKey =
oPointDescriptionKeySet.Add("SAMP*")
www.EngineeringBooksPdf.com
' Turn off the scale override, and instead scale
' to whatever is passed as the first parameter.
oPointDescriptionKey.OverrideScaleParameter = False
oPointDescriptionKey.UseDrawingScale = False
oPointDescriptionKey.ScaleParameter = 1
oPointDescriptionKey.ScaleXY = True
2000,3700.0,4900.0,150.0,SAMPLE 4
2001,3750.0,4950.0,150.0,SAMPLE 4
When a text file is loaded using Points.ImportPoints, the first alphanumeric
element in a point’s description is compared to the names of all point
description keys. If a match is found, the point’s settings are adjusted to match
the description key. Any parameters to pass to the key are added after the
description, separated by spaces. If using parameters, use a comma delimited
file format or else any parameters will be ignored. This process only takes place
when points are read from a file - after a point is created, setting the
AeccPoint.RawDescription property does nothing to change the point’s style.
Point Groups
This section explains the creation and use of point groups, which is a named
subset of the points in a document.
www.EngineeringBooksPdf.com
AeccDocument.PointGroups.Add method and specifying a unique identifying
string name. A new empty point group is returned.
' Get the collection of all point groups from the document.
Dim oPtGroups As AeccPointGroups
Dim oPtGroup As AeccPointGroup
Set oPtGroups = oAeccDocument.PointGroups
InlcudeElevations ExcludeElevations
IncludeFullDescriptions ExcludeFullDescriptions
IncludeNames ExcludeNames
IncludeNumbers ExcludeNumbers
IncludeRawDescriptions ExcludeRawDescriptions
IncludePointGroups
Each of these properties is a string that describes the selection criteria used.
As many properties may be used as needed to make your selection. Any
property left blank has no affect on the selection.
The properties that query string properties of points (FullDescription, Name,
RawDescription) consist of a comma-separated list of possible strings to match
against. Each element in that list may contain the wildcards “?” and “*”. The
www.EngineeringBooksPdf.com
properties that deal with number properties of points consist of a comma
delineated list of specific numbers or ranges of numbers (two values separated
by a hyphen, such as “100-200”). The properties that deal with elevation
consist of a comma delineated list of specific elevations, ranges of elevation,
upper limits (a less-than symbol followed by a value, such as “<500”), or lower
limits (a greater-than symbol followed by a value, such as “>100”).
' Set the elevation of all the points in the group to 100.
oPtGroup.Elevation = 100
oPtGroup.OverrideElevation = True
Point groups can also be used to define or modify a TIN surface. The
AeccTinSurface.PointGroups property is a collection of point groups. When
www.EngineeringBooksPdf.com
a point group is added to the collection, every point in the point group is
added to the TIN surface.
Sample Program
SurfacePointsSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\SurfacePoints\SurfacePointsSample.dvb
The sample code from this section can be found in context in the
SurfacePointsSample.dvb program. The Points module contains functions that
load points from a text file, create points manually, use description keys, deal
with point groups, and use points to modify a surface. The PointStyles module
demonstrates the creation of a point style and a point label style.
www.EngineeringBooksPdf.com
Surfaces in COM
Object Hierarchy
www.EngineeringBooksPdf.com
Using the Surfaces Collection
All surfaces in a drawing are located in the AeccDocument.Surfaces collection.
Each surface in the collection can be accessed through the AeccSurfaces.Item
method, which takes either an integer index or the string name of the surface.
The AeccSurfaces.Item method returns a generic reference of type
AeccSurface, so you need to check the AeccSurface.Type property to actually
determine what kind of surface it is.
This sample examines each surface in the drawing and reports what kind of
surface it is:
For i = 0 To oAeccDocument.Surfaces.Count - 1
Set oSurface = oAeccDocument.Surfaces.Item(i)
Select Case (oSurface.Type)
Case aecckGridSurface:
Dim oGridSurface As AeccGridSurface
Set oGridSurface = oSurface
Debug.Print oGridSurface.Name & ": Grid"
Case aecckTinSurface:
Dim oTinSurface As AeccTinSurface
Set oTinSurface = oSurface
Debug.Print oTinSurface.Name & ": TIN"
Case aecckGridVolumeSurface:
Dim oGridVolume As AeccGridVolumeSurface
Set oGridVolume = oSurface
Debug.Print oGridVolume.Name & ": Grid Volume"
Case aecckTinVolumeSurface:
Dim oTinVolume As AeccTinVolumeSurface
Set oTinVolume = oSurface
Debug.Print oTinVolume.Name & ": TIN Valume"
End Select
Next i
www.EngineeringBooksPdf.com
Creating a Surface
This section covers the various methods for creating surfaces. Loading surfaces
from LandXML files, .TIN files, or DEM files is explained. It also demonstrates
creating new TIN, grid, and volume surfaces.
www.EngineeringBooksPdf.com
Creating a Surface Using AddTinSurface
You can also create empty TIN surfaces by adding to the document’s collection
of surfaces through the AeccSurfaces.AddTinSurface method. This method
requires preparing an object of type AeccTinCreationData. It is important to
specify every property of the AeccTinCreationData object to avoid errors.
oTinData.Name = "EG"
oTinData.Description = "Sample TIN Surface"
oTinData.Layer = oAeccDocument.Layers.Item(0).Name
oTinData.BaseLayer = oAeccDocument.Layers.Item(0).Name
oTinData.Style = oAeccDocument.SurfaceStyles.Item(0).Name
Set oTinSurface = oAeccDocument.Surfaces
.AddTinSurface(oTinData)
NOTE
The conversion process between the raster information and a surface can be
slow. Be sure to indicate this to the user.
www.EngineeringBooksPdf.com
Creating a Surface From AddGridSurface
www.EngineeringBooksPdf.com
sStyleName = oAeccDocument.SurfaceStyles.Item(0).Name
Adding a Boundary
A boundary is a closed polyline that defines the visibility of surface triangles
within it. A boundary can hide all triangles outside it, hide all triangles inside
it, or show triangles inside it that would otherwise be hidden. Boundaries also
change surface statistics such as area and number of triangles. Boundaries can
either be “destructive” (totally hiding triangles that cross the boundary) or
“non-destructive” (clipping triangle edges at the point where they cross the
boundary). Normally, TIN surfaces use non-destructive boundaries, while grid
surfaces can only have destructive boundaries:
www.EngineeringBooksPdf.com
Legacy COM API | 253
www.EngineeringBooksPdf.com
Non-destructive Boundary
Destructive Boundary
All boundaries applied to a surface are stored in the AeccSurface.Boundaries
collection. The boundary itself is defined by an AutoCAD entity such as a
closed POLYLINE or POLYGON. The height of the entity plays no part in how
surface triangles are clipped, so you can use 2D entities. This entity can also
contain curves, but the boundary always consists of lines. How these lines are
tessellated is defined by the mid-ordinate distance, which is the maximum
distance between a curve and the lines that are generated to approximate it:
www.EngineeringBooksPdf.com
Mid-ordinate Distance
This sample adds a square outside boundary to a surface:
www.EngineeringBooksPdf.com
Set oPoly = oAeccDocument.Database.ModelSpace _
.AddPolyline(dPoints)
oPoly.Closed = True
NOTE
Any operation that causes the formation of new triangles (such as adding
points or breaklines to a TIN surface) may result in triangles that cross existing
boundary lines. Boundaries should always be added after every other operation
that adds points to a surface.
oTinSurface.DEMFiles.Add("C:\My Documents\file.dem")
www.EngineeringBooksPdf.com
Surfaces have CreateSnapshot, RebuildSnapshot, and RemoveSnapshot methods.
Both CreateSnapshot and RebuildSnapshot will overwrite an existing snapshot.
TIP
RebuildSnapshot will cause an error if the snapshot does not exist.
CreateSnapshot and RebuildSnapshot can also cause errors if the surface is
out-of-date.
Finding Intersections
When working with surfaces, it can be useful to determine where a vector
intersects with a surface, which you can do with the surface’s
IntersectPointWithSurface() method. For example, you can determine if
the top of a structure is visible from a point on the surface, or whether one
point on the surface is visible from another point. This example tests whether
a vector starting at (20424.7541, 20518.0409, 100) pointing in direction (0.6,
0.4, -0.5) intersects with the first surface in the drawing, and if it does, it prints
out the intersection location:
www.EngineeringBooksPdf.com
Working with TIN Surfaces
This section covers the various methods for modifying or examining existing
TIN surfaces. This includes adding new point data directly, adding breaklines,
and adding contours.
www.EngineeringBooksPdf.com
pt(0) = Int(5000 * Rnd())
pt(1) = Int(5000 * Rnd())
pt(2) = Int(200 * Rnd())
Dim oPoint As AeccPoint
Set oPoint = oAeccDocument.Points.Add(pt)
oPoint.Name = "Point" & CStr(i)
Next i
www.EngineeringBooksPdf.com
NOTE
For more information about breaklines, see Breaklines in the AutoCAD Civil
3D User’s Guide.
www.EngineeringBooksPdf.com
Set oBreakline =
oTinSurface.Breaklines.AddProximityBreakline( _
oEntityArray, _
"Sample Proximity Break", _
1#)
www.EngineeringBooksPdf.com
' These are the elevations of the wall at each endpoint in
' the polyline entity.
Dim dElevations(3) As Double
' This is an array of ooleans, one for each entity.
Dim bOffsets(0) As Boolean
For more information about these options, see Importing Breaklines from a
File in the .
This sample shows how to import breaklines from a file named eg1.flt, and to
get the first newly created breakline:
www.EngineeringBooksPdf.com
Adding Contours to a TIN Surface
A contour is an open or closed entity that describes the altitude of the surface
along the entity. Contours must have a constant altitude. The z value of the
first point of the entity is used as the altitude of entire entity, no matter what
is specified in the following points. Contours also have settings that can adjust
the number of points added to the surface - when you create a contour, you
specify a weeding distance, a weeding angle, and a distance parameter. Points
in the contour are removed if the distance between the points before and after
is less than the weeding distance and if the angle between the lines before
and after is less than the weeding angle. Each line segment is split into equal
sections with a length no greater than the supplemental distance parameter.
Any curves in the entity are also tessellated according to the mid-ordinate
distance, just like breaklines. The supplemental distance value has precedence
over the weeding values, so it is possible that the final contour will have line
segments smaller than the weeding parameters specify.
For more information about weeding and countours, see Weeding and
Supplementing Factors for Contours in the .
A TIN surface has a collection of contours in the AeccTinSurface.Contours
property. The following sample demonstrates adding a contour to a surface:
www.EngineeringBooksPdf.com
dWeedAngle = 0.0698 ' 0.0698 radians = 4 degrees
dDist = 85.5
dMidOrdDist = 1#
Dim oNewContour As AeccSurfaceContour
Set oNewContour = oTinSurf.Contours.Add(oEntities, _
"Sample Contour", dWeedDist, dWeedAngle, dDist,
dMidOrdDist)
NOTE
The contours that you wish to extract must be visible in the drawing for this
example to work.
...
Dim z As Double
Dim objSurf As AeccSurface
Set objSurf = g_oAeccDoc.Surfaces(0)
Dim varObjects As Variant
Dim objEnt As AcadEntity
Dim iCtr As Integer, iLow As Integer, iHigh As Integer
varObjects =
objSurf.ExtractContour(aeccDisplayOrientationPlan,
aeccSFMajorContours, 90, 95)
iLow = LBound(varObjects)
iHigh = UBound(varObjects)
For iCtr = iLow To iHigh
Set objEnt = varObjects(iCtr)
Debug.Print TypeName(objEnt)
Next iCtr
Surface Style
This section explains the creation and application of surface styles.
www.EngineeringBooksPdf.com
Creating a Style
All surface styles are stored in the AeccDocument.SurfaceStyles collection,
an object of type AeccSurfaceStyles. To create a new style, call the
AeccSurfaceStyles.Add method with the name of your new style. It is initially
set according to the document’s ambient settings.
oSurfaceStyle.PointStyle.DisplayStylePlan.Visible = False
oSurfaceStyle.BoundaryStyle.DisplayInteriorBoundaries =
False
oSurfaceStyle.ContourStyle.MinorContourDisplayStylePlan _
.Visible = False
oSurfaceStyle.ContourStyle.UserContourDisplayStylePlan _
.Visible = False
oSurfaceStyle.GridStyle.DisplayStylePlan.Visible = False
oSurfaceStyle.DirectionStyle.DisplayStylePlan.Visible =
False
www.EngineeringBooksPdf.com
oSurfaceStyle.ElevationStyle.DisplayStylePlan.Visible =
False
oSurfaceStyle.SlopeStyle.DisplayStylePlan.Visible = False
oSurfaceStyle.SlopeArrowStyle.DisplayStylePlan.Visible =
False
oSurfaceStyle.WatershedStyle.DisplayStylePlan.Visible =
False
www.EngineeringBooksPdf.com
property as CalculateElevationRegions may create fewer regions than
specified by the first parameter.
CalculateElevationRegions creates regions according to the statistical method
specified in the AeccSurfaceStyle.ElevationStyle.GroupValuesBy property.
The elevation style object also contains other means of modifying how
elevation analyses are made, such as using one of the preset color schemes.
This sample creates an elevation analysis for a surface using shades of green:
Dim oSurfaceAnalysisElevation As
AeccSurfaceAnalysisElevation
Set oSurfaceAnalysisElevation = oSurface.SurfaceAnalysis
_
.ElevationAnalysis
Dim oElevationRegions As AeccElevationRegions
Set oElevationRegions = oSurfaceAnalysisElevation _
.CalculateElevationRegions(6, False)
' See exactly how many regions were created.
Debug.Print oSurfaceAnalysisElevation.ElevationRegions.Count
www.EngineeringBooksPdf.com
the surface into separate regions, each with its own drain target or targets.
The set of all these regions are held in the
AeccSurfaceAnalysisWatershed.WatershedRegions collection.
You have some control over how the regions are split. If the boolean
AeccSurfaceAnalysisWatershed.MergeAdjacentBoundaries property is set to
True, then regions along the boundary are merged into one region if their
boundary points or segments touch. If a depression on the surface has a
minimum average depth smaller than the value of the
AeccSurfaceAnalysisWatershed.MergeDepression property, then the
depression does not become its own region and is combined with the region
it drains into.
oSurface.SurfaceAnalysis.WatershedAnalysis _
.MergeAdjacentBoundaries = True
oSurface.SurfaceAnalysis.WatershedAnalysis _
.MergeDepression = 10.65
Dim i as Integer
www.EngineeringBooksPdf.com
For i = 0 To oWSAnalysis.Count - 1
Select Case (oWSAnalysis.Item(i).Type)
Case aeccWatershedBoundaryPoint
Dim oWSPoint As AeccWatershedRegionBoundaryPoint
Set oWSPoint = oWSAnalysis.Item(i)
Case aeccWatershedBoundarySegment
Dim oWSSegment As AeccWatershedRegionBoundarySegment
Set oWSSegment = oWSAnalysis.Item(i)
Case aeccWatershedDepression
Dim oWSDepression As AeccWatershedRegionDepression
Set oWSDepression = oWSAnalysis.Item(i)
Case aeccWatershedFlat
Dim oWSFlat As AeccWatershedRegionFlat
Set oWSFlat = oWSAnalysis.Item(i)
Case aeccWatershedMultiDrain
Dim oWSMulti As AeccWatershedRegionMultiRegionDrain
Set oWSMulti = oWSAnalysis.Item(i)
Case aeccWatershedMultiDrainNotch
Dim oWSNotch As
AeccWatershedRegionMultiRegionDrainNotch
Set oWSNotch = oWSAnalysis.Item(i)
Case Else 'aeccWatershedUnknownSink
End Select
Next i
Objects derived from AeccWatershedRegion have other common features.
They all have an identification number in the AeccWatershedRegion.Id
property. They also have a AeccWatershedRegion.Boundary property, which
contains a 2-dimensional array containing the points of a closed polygon
enclosing the region.
www.EngineeringBooksPdf.com
Boundary Point Regions
Dim j as Integer
Debug.Print "This region drains through the following"
Debug.Print "line segments:"
For j = 0 To UBound(vDrainSegments, 1) - 1
Debug.Print vDrainSegments(j, 0) & ", " _
& vDrainSegments(j, 1) & ", " _
& vDrainSegments(j, 2) & " to ";
Debug.Print vDrainSegments(j + 1, 0) & ", " _
& vDrainSegments(j + 1, 1) _
& ", " & vDrainSegments(j + 1, 2)
Next j
www.EngineeringBooksPdf.com
Depression Regions
For j = 0 To oDrains.Count - 1
' See what kind of drain targets we have.
If (UBound(oDrains.Item(j).Targets) = -1) Then
' This depression drains outside the surface.
Debug.Print "Drain through point: " & _
oDrains.Item(j).Location(0) & ", " & _
oDrains.Item(j).Location(1) & ", " & _
oDrains.Item(j).Location(2) & _
" to the surface boundary."
Else
' This depression can drain into other regions.
Dim lTargets() As Long
lTargets = oDrains.Item(j).Targets
sTargets = CStr(lTargets(0))
Dim k as Integer
For k = 1 To UBound(lTargets)
sTargets = sTargets & ", " & CStr(lTargets(k))
Next k
Debug.Print "Drain through point: " & _
oDrains.Item(j).Location(0) & ", " & _
oDrains.Item(j).Location(1) & ", " & _
oDrains.Item(j).Location(2) & _
" into the following regions: " & sTargets
Endif
Next j
Flat Regions
A flat area that only drains into one region is combined into that region. If a
flat surface drains into multiple regions, then it is created as a separate region
www.EngineeringBooksPdf.com
of type AeccWatershedRegionFlat. The only feature of flat regions is an array
of all drain targets.
varDrainsInto = oWSFlat.DrainsInto
sTargets = CStr(varDrainsInto(0))
For k = 1 To UBound(varDrainsInto)
sTargets = sTargets & ", " & CStr(varDrainsInto(k))
Next k
Debug.Print "This region drains into regions " & sTargets
A region of the surface may drain through a point into many different regions.
Such regions are represented by an object of type
AeccWatershedRegionMultiRegionDrain. These regions have properties
containing the point water drains through and a collection of all regions into
which water flows.
A region can also drain into many other regions through a series of line
segments. These regions are represented by an object of type
www.EngineeringBooksPdf.com
AeccWatershedRegionMultiRegionDrainNotch and they keep both a list of all
regions this region drains into and a list of all segments this region drains
through.
sTargets = CStr(varDrainsInto(0))
For k = 1 To UBound(varDrainsInto)
sTargets = sTargets & ", " & CStr(varDrainsInto(k))
Next k
Debug.Print "This region drains through these segments: "
For j = 0 To UBound(vDrainSegments, 1) - 1
Debug.Print vDrainSegments(j, 0) & ", " _
& vDrainSegments(j, 1) & ", " _
& vDrainSegments(j, 2) & " to ";
Debug.Print vDrainSegments(j + 1, 0) & ", " _
& vDrainSegments(j + 1, 1) _
& ", " & vDrainSegments(j + 1, 2)
Next j
Sample Programs
SurfacePointsSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\SurfacePoints\SurfacePointsSample.dvb
This sample program demonstrates the creation of surfaces using point data
loaded from a file and through use of point groups. Surface styles are created
and applied.
www.EngineeringBooksPdf.com
SurfaceOperations.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\SurfaceOperations\SurfaceOperationsSample.dvb
This sample demonstrates the elevation analysis and watershed analysis
features. The watershed analysis includes a full report of all watershed regions.
Breaklines of all kinds, contours, and borders are applied to the surfaces as
well.
CorridorSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Corridor\CorridorSample.dvb
A TIN volume surface is created between the corridor datum surface and the
ground surface. Cut and fill information is obtained from this volume surface.
www.EngineeringBooksPdf.com
Sites and Parcels in COM
Object Hierarchy
www.EngineeringBooksPdf.com
Sites
This section explains the creation and use of sites, which are used as containers
for parcels and alignments (for information about alignments, see Chapter 6:
Alignments (page 284)).
Creating Sites
All sites in a document are held in the AeccDocument.Sites collection, an
object of type AeccSites. The AeccSites.Add method creates a new empty
site with the specified name.
Using Sites
A site represents a distinct group of alignments and parcels. Besides containing
collections of parcels and alignments, the AeccSite object also contains
properties describing how the site objects are numbered and displayed.
Parcels
This section covers the creation and use of parcels. Parcel segments, parcel
loops, and parcel styles and label styles are also explained.
www.EngineeringBooksPdf.com
Creating Parcels with Parcel Segments
While a site contains a collection of parcels, this collection has no Add method.
Instead, parcels are automatically generated from the parcel segments added
to the AeccSite.ParcelSegments collection. A parcel segment is a
2-dimensional line, curve, or AutoCAD entity. Once a closed structure can be
formed from the segments in the site, a parcel is automatically formed. Each
additional parcel segment that forms new closed structures creates additional
parcels. This may affect the shape of existing parcels - if an existing parcel is
bisected by a new segment, the existing parcel is reduced in size and a new
parcel is formed.
' Parcel 1
Call oSegments.AddLine(0, 0, 0, 200)
Call oSegments.AddCurve(0, 200, -0.5, 200, 200)
Call oSegments.AddLine(200, 200, 200, 0)
Call oSegments.AddLine(200, 0, 0, 0)
' Parcel 2
Call oSegments.AddCurve2(200, 200, 330, 240, 400, 200)
Call oSegments.AddLine(400, 200, 400, 0)
www.EngineeringBooksPdf.com
About Parcel Segments
Each parcel segment is a collection of parcel segment elements, which are
represented by objects derived from the AeccParcelSegmentElement base class.
A segment element is an undivided part of a segment that can be used to
create a parcel. When an element is intersected by another parcel segment,
the element is split into two contiguous elements:
Dim i as Integer
For i = 0 to oSegment.Count - 1
Dim oElement As AeccParcelSegmentElement
Set oElement = oSegment.Item(i)
www.EngineeringBooksPdf.com
Dim oSegmentLine As AeccParcelSegmentLine
Set oSegmentLine = oElement
Debug.Print " is a line. "
ElseIf (TypeOf oElement Is AeccParcelSegmentCurve) Then
Dim oSegmentCurve As AeccParcelSegmentCurve
Set oSegmentCurve = oElement
Debug.Print " is a curve with a radius of:" _
& oSegmentCurve.Radius
End If
Next i
Dim i as Integer
For i = 0 to oParcel.ParcelLoops.Count - 1
Dim oElement As AeccParcelSegmentElement
Set oElement = oParcel.ParcelLoops.Item(i)
www.EngineeringBooksPdf.com
& oSegmentCurve.Radius
End If
Next i
This sample creates a parcel style, sets the style properties, and assigns the
style to the parcel object “oParcel”:
www.EngineeringBooksPdf.com
collection of all parcel styles currently in use. These styles are arranged
according to priority level. When two parcels with different styles share a
segment, the segment is displayed with the higher priority style. Among these
styles is the global site parcel style, set through the
AeccParcels.Properties.SiteParcelStyle property. The site parcel style
defines the outside boundary style of parcels within the site, given a high
enough priority.
This sample displays the current order of parcel styles in the site and then
modifies the order:
' List all styles used by parcels in this site with their
' priority
Dim oSegmentDisplayOrder As AeccSegmentDisplayOrder
Set oSegmentDisplayOrder = _
oSite.Parcels.Properties.SegmentDisplayOrder
' Set the style with the highest priority to the lowest
' priority.
Dim lLowestPosition as Long
lLowestPosition = oSegmentDisplayOrder.Count - 1
oSegmentDisplayOrder.SetPriority 0, lLowestPosition
www.EngineeringBooksPdf.com
Parcel label styles can use the following property fields in the contents of any
text component:
<[Name(CU)]>
<[Description(CP)]>
<[Parcel Area(Usq_ft|P2|RN|AP|Sn|OF)]>
<[Parcel Number(Sn)]>
<[Parcel Perimeter(Uft|P3|RN|AP|Sn|OF)]>
<[Parcel Address(CP)]>
Label styles are described in detail in the chapter 1 section Label Styles (page
211).
www.EngineeringBooksPdf.com
Set oApp = ThisDrawing.Application
' NOTE - Always specify the version number.
Const sAppName = "AeccXUiLand.AeccApplication.6.0"
Set g_vCivilApp = oApp.GetInterfaceObject(sAppName)
Set g_oDocument = g_vCivilApp.ActiveDocument
Set g_oAeccDb = g_oDocument.Database
Dim oUDPClass As AeccUserDefinedPropertyClassification
Dim oUDPProp As AeccUserDefinedProperty
'Create a user-defined parcel property classification
Set oUDPClass =
g_oAeccDb.ParcelUserDefinedPropertyClassifications.Add("Example")
' Add a Property to our new classification An integer using
upper
' and lower bound limits of 10 and 20 with a default value
of 15
Set oUDPProp = oUDPClass.UserDefinedProperties.Add("Extra
Data", _
"Some Extra Data", aeccUDPPropertyFieldTypeInteger,
True, False, 10, True, _
False, 20, True, 15, Null)
www.EngineeringBooksPdf.com
Dim varArray As Variant
varArray = objPart.GetPoints()
Debug.Print "Number of points = " & UBound(varArray)
ElseIf TypeOf objEnt Is AcadEntity Then
Set objAcadEnt = objEnt
Debug.Print TypeName(objAcadEnt)
If (g_oAeccDoc.Sites.Count = 0) Then
g_oAeccDoc.Sites.Add "TestSite"
End If
Set objPart =
g_oAeccDoc.Sites(0).FeatureLines.AddFromPolyline(objAcadEnt.ObjectID,
"Standard")
End If
Sample Program
ParcelSample.dvb
<installation-directory>\Sample\Civil 3D
API\COM\Vba\Parcel\ParcelSample.dvb
This sample program accesses the active document, creates a site, and then
creates three parcels by adding line segments, curve segments, and entity
segments. A new parcel style is composed and applied to one of the parcels.
Alignments in COM
This chapter covers creating and using Alignments, Stations, and Alignment
styles using the COM API. For information about performing these tasks using
the .NET API, see the chapter Using Alignments in .NET (page 65).
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
COM API Alignment Object Model
Creating an Alignment
Alignments are usually created in existing sites. Each AeccSite object has its
own collection of alignments held in an AeccAlignments object in the
AeccSite.Alignments property. There is also a collection of alignments that
are not associated with a site in the AeccDocument.AlignmentsSiteless
property.
www.EngineeringBooksPdf.com
' Create an empty alignment that draws to layer 0.
Dim oAlignment as AeccAlignment
Set oAlignment = oAlignments.Add("Sample Alignment", "0",
_
oAlignmentStyle.Name, oAlignmentLabelStyleSet.Name)
www.EngineeringBooksPdf.com
Defining an Alignment Path Using Entities
An alignment is made up of a series of entities, which are individual lines,
curves, and spirals that make up the path of an alignment. A collection of
entities is held in the AeccAlignment.Entities collection. This collection has
a wide array of methods for creating new entities.
The following code sample demonstrates some of the entity creation methods:
www.EngineeringBooksPdf.com
property, you can determine the specific type of each entity and cast the
reference to the correct type.
The following sample loops through all entities in an alignment, determines
the type of entity, and prints one of its properties.
Dim i as Integer
For i = 0 To oAlignment.Entities.Count - 1
Select Case (oAlignment.Entities.Item(i).Type)
Case aeccTangent
Dim oTangent As AeccAlignmentTangent
Set oTangent = oAlignment.Entities.Item(i)
Debug.Print "Tangent length:" & oTangent.Length
Case aeccArc
Dim oArc As AeccAlignmentArc
Set oArc = oAlignment.Entities.Item(i)
Debug.Print "Arc radius:" & oArc.Radius
Case aeccSpiral
Dim oSpiral As AeccAlignmentSpiral
Set oSpiral = oAlignment.Entities.Item(i)
Debug.Print "Spiral A value:" & oSpiral.A
Case aeccSpiralCurveSpiralGroup
Dim oSCSGroup As AeccAlignmentSCSGroup
Set oSCSGroup = oAlignment.Entities.Item(i)
Debug.Print "Radius of curve in SCS group:" _
& oSCSGroup.Arc.Radius
www.EngineeringBooksPdf.com
Stations
NOTE
Some functions, such as AeccAlignment.InstantaneousRadius, require a “raw”
station value without regard to modifications made by station equations.
www.EngineeringBooksPdf.com
' would this alignment have?
Set oStations = oAlignment.GetStations(aeccAll, 100#, 20#)
Debug.Print "Number of labels: " & oStations.Count
www.EngineeringBooksPdf.com
Set oDesignSpeed = oAlignment.DesignSpeeds.Add(1427.131)
oDesignSpeed.Value = 35
oDesignSpeed.Comment = "End of curve"
' Make Alignment speed-based
oAlignment.DesignSpeedBased = True
Superelevation
Another setting that can be applied to certain stations of an alignment is the
superelevation, used to adjust the angle of roadway section components for
corridors based on the alignment. The inside and outside shoulders and road
surfaces can be adjusted for both the left and right sides of the road. The
collection of all superelevation information for an alignment is stored in the
AeccAlignment.SuperelevationData property. Note that, unlike most AutoCAD
Civil 3D API collections, the Add method does not return a new default entity
but instead passes a reference to the new object through the second parameter.
An individual superelevation data element (type
AeccSuperelevationDataElement) can be accessed through the
AeccAlignment.SuperelevationAtStation method.
This code creates a new superelevation data element at station 11+00.00 and
sets the properties of that element:
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperLeftOutShoulderCrossSlope) = 0.05
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperLeftOutLaneCrossSlope) = 0.02
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperLeftInLaneCrossSlope) = 0.01
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperLeftInShoulderCrossSlope) = 0.03
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperRightInShoulderCrossSlope) = 0.03
www.EngineeringBooksPdf.com
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperRightInLaneCrossSlope) = 0.01
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperRightOutLaneCrossSlope) = 0.02
oSuperElevationElem.SegmentCrossSlope _
(aeccSuperRightOutShoulderCrossSlope) = 0.05
oSuperElevationElem.TransPointType = aeccSuperManual
oSuperElevationElem.TransPointDesc = "Manual adjustment"
oSuperElevationElem.RawStation = 1100
Each superelevation data element represents a point in the transition of the
roadway cross section. A single transition from normal to full superelevation
and back is a zone. A collection of data elements representing a single zone
can be retrieved by calling the AeccAlignment.SuperelevationZoneAtStation
method.
This sample retrieves the data elements that are part of the superelevation
zone starting at station 0+00.00, and prints all their descriptions:
Set oSuperElevationData = _
oAlignment.SuperelevationZoneAtStation(0)
Alignment Style
www.EngineeringBooksPdf.com
.Add("Sample alignment style")
www.EngineeringBooksPdf.com
Labels may be placed at the endpoints of each alignment entity. Such labels
are controlled through the AeccAlignmentLabelSet.GeometryPointLabelSet
property, an AeccLabelSet. The label set is a collection of AeccLabelStyle
objects. Labels at each change in alignment design speeds and station equations
(the AeccAlignmentLabelSet.GeometryPointLabelSet and
AeccAlignmentLabelSet.GeometryPointLabelSet properties respectively) are
also AeccLabelSet objects.
All label styles at alignment stations can draw from the following list of
property fields:
<[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)]>
www.EngineeringBooksPdf.com
Label styles for minor stations, geometry points, design speeds, and station
equations can also use the following property fields:
Label styles are described in detail in the chapter 1 section Label Styles (page
211).
Sample Program
AlignmentSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Alignment\AlignmentSample.dvb
The sample code from this chapter can be found in context in the
AlignmentSample.dbp project. This project can create alignments based on
AutoCAD polyline entities or through layout commands. It demonstrates
using styles, label styles, station equations, design speeds, and superelevation.
www.EngineeringBooksPdf.com
Profiles in COM
This chapter covers creating and using Profiles using the COM API. For
information about performing these tasks using the .NET API, see the chapter
Profiles in .NET (page 78).
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
Profile Object Model
Profiles
This section covers the creation and style of profiles. Profiles are the vertical
analogue to alignments. Together, an alignment and a profile represent a 3D
path.
www.EngineeringBooksPdf.com
AeccProfile.Entities collection. AeccProfile.Entities also contains all
the methods for creating new entities.
This sample creates a new profile along the alignment “oAlignment” and then
adds three entities to define the profile shape. Two straight entities are added
at each end and a symmetric parabola is added in the center to join them and
represent the sag of a valley.
www.EngineeringBooksPdf.com
(oProfileTangent1.Id, _
oProfileTangent2.Id, _
aeccSag, _
dCrestLen, _
True)
Debug.Print oPVI.Station
www.EngineeringBooksPdf.com
Creating a Profile Style
The profile style, an object of type AeccProfileStyle, defines the visual display
of profiles. The collection of all such styles in a document are stored in the
AeccDocument.LandProfileStyles property. The style contains objects of type
AeccDisplayStyle which govern the display of arrows showing alignment
direction and of the lines, line extensions, curves, parabolic curve extensions,
symmetrical parabolas and asymmetrical parabolas that make up a profile.
The properties of a new profile style are defined by the document’s ambient
settings.
' For all profiles that use this style, line elements
' will be yellow, curve elements will be shades of green,
' and extensions will be dark grey. No arrows will be shown.
With oProfileStyle
.ArrowDisplayStyleProfile.Visible = False
.LineDisplayStyleProfile.Color = 50 ' yellow
.LineDisplayStyleProfile.Visible = True
.LineExtensionDisplayStyleProfile.Color = 251 ' grey
.LineExtensionDisplayStyleProfile.Visible = True
.CurveDisplayStyleProfile.Color = 80 ' green
.CurveDisplayStyleProfile.Visible = True
.ParabolicCurveExtensionDisplayStyleProfile.Color = 251
' grey
.ParabolicCurveExtensionDisplayStyleProfile.Visible =
True
.SymmetricalParabolaDisplayStyleProfile.Color = 81 '
green
.SymmetricalParabolaDisplayStyleProfile.Visible = True
.AsymmetricalParabolaDisplayStyleProfile.Color = 83 '
green
.AsymmetricalParabolaDisplayStyleProfile.Visible = True
End With
' Properties for 3d display should also be set.
www.EngineeringBooksPdf.com
Profile Views
This section describes the creation and display of profile views. A profile view
is a graph displaying the elevation of a profile along the length of the related
alignment.
www.EngineeringBooksPdf.com
Dim oProfileViewStyle As AeccProfileViewStyle
Set oProfileViewStyle = oDocument.ProfileViewStyles _
.Add("Profile View style 01")
Within each axis style are properties for specifying the tick marks placed along
the axis. Both major tick marks and minor tick marks are represented by objects
of type AeccTickStyle. AeccTickStyle manages the location, size, and visual
style of tick marks through its Interval, Size and DisplayStylePlan properties.
Note that while most style properties use drawing units, the Interval property
www.EngineeringBooksPdf.com
uses the actual ground units of the surface. The AeccTickStyle object also
sets what text is displayed at each tick, including the following property fields:
Graph Title
www.EngineeringBooksPdf.com
adjust the position, style, and border of the title. The text of the title can
include any of the following property fields:
<[Parent Alignment(CP)]>
<[Drawing Scale(P4|RN|AP|OF)]>
' Adjust the top axis. Put station information here, with
' the title at the far left.
With oProfileViewStyle.TopAxis
.DisplaySyle2d.Visible = True
www.EngineeringBooksPdf.com
' Modify the text to display meters in decimal
' format.
.MajorTickStyle.Text = "<[Station Value(Um|FD|P1)]> m"
.MajorTickStyle.Interval = 164.041995
Dim dPoint(0 To 2) As Double
dPoint(0) = 0.13
dPoint(1) = 0#
.TitleStyle.Offset = dPoint
.TitleStyle.Text = "Meters"
.TitleStyle.Position = aeccStart
End With
Sample Programs
ProfileSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Profile\ProfileSample.dvb
This sample creates a surface from a file and an alignment using entities. It
creates a profile based on the existing surface along the alignment. It then
creates a second profile using entities and points of vertical intersection. A
profile view is made displaying both profiles. The style and label style of the
profile view are set with custom styles. Data bands are added to the profile
view.
CorridorSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Corridor\CorridorSample.dvb
The CreateCorridor method of the Corridor module shows the creation of a
profile using entities.
www.EngineeringBooksPdf.com
Sections in COM
Object Hierarchy
www.EngineeringBooksPdf.com
Sample Lines
This section covers the creation and use of sample lines. Sample lines are line
segments placed at regular intervals across an alignment. They can be used to
define the location and orientation of surface cross sections that can be studied
through section views.
' Get all the styles we will need for our sample line
object.
' We will use whatever default styles the document contains.
Dim oGroupPlotStyle As AeccGroupPlotStyle
Set oGroupPlotStyle = oDocument.GroupPlotStyles.Item(0)
' Create a sample line group using the above styles and
drawn
' to layer "0".
Dim sLayerName as String
www.EngineeringBooksPdf.com
sLayerName = "0"
Dim oSampleLineGroup As AeccSampleLineGroup
Set oSampleLineGroup = oSampleLineGroups.Add( _
"Example Sample Line Group", _
sLayerName, _
oGroupPlotStyle, _
oSampleLineStyle, _
oSampleLineLabelStyle)
The first step in creating sample lines along an alignment is to specify the
surface or surfaces being sampled. This is accomplished by adding surfaces to
the AeccSampleLineGroup.SampledSurfaces collection. The
AeccSampledSurfaces.AddAllSurfaces method adds one AeccSampledSurface
object to the collection for each surface in the document. The
AeccSampledSurfaces.Add method takes a specific surface object and an
AeccSectionStyle object and returns a reference to the added
AeccSampledSurface object. It is important to then set the boolean
AeccSampledSurface.Sample property to True.
NOTE
If no SampledSurface object added to the AeccSampledSurfaces collection
has the Sample property set to True, then no sections will be generated for
that sample line.
This sample demonstrates how to add a single surface to a sample line group
and how to add all surfaces in the drawing to a sample line group:
' Get the section style we need for our sampled surface
' object. We use the default style of the document.
Dim oSectionStyle As AeccSectionStyle
Set oSectionStyle = oDocument.SectionStyles.Item(0)
www.EngineeringBooksPdf.com
' This section demonstrates adding a single surface to
' the sample line group. An AeccSampleSurface object is
' returned, which needs some properties set.
Dim oSampledSurface As AeccSampledSurface
Set oSampledSurface = oSampleLineGroup.SampledSurfaces _
.Add(oSurface, oSectionStyle)
oSampledSurface.UpdateMode = aeccSectionStateDynamic
' We need to set the Sample property of the
' SampledSurface object. Otherwise the sampled surface
' will not be used in creating sections.
oSampledSurface.Sample = True
www.EngineeringBooksPdf.com
Dim s1 As AeccSurface
Dim e1 As AcadEntity
Dim s2 As AeccPipeNetwork
s1 = SampledSurfaces.Item(0).Surface
e1 = SampledSurfaces.Item(1).AcadEntity ' Surface would
throw exception
MessageBox.Show(e1.ObjectName)
s2 = e1
MessageBox.Show(s2.Name)
www.EngineeringBooksPdf.com
Dim dSwathWidthLeft As Double
Dim dSwathWidthRight As Double
Dim dStation As Double
dSwathWidthRight = 45.5
dSwathWidthLeft = 35.5
dStation = 1100.5
Call oSampleLineGroup.SampleLines.AddByStation( _
"Sample Line 02", _
dStation, _
dSwathWidthLeft, _
dSwathWidthRight)
NOTE
The AeccStationRange.SampleLineStyle property must be set to a valid object
or the AddByStationRange method will fail.
www.EngineeringBooksPdf.com
oStationRange.EndRangeAtAlignmentEnd = False
' Only sample for 1000 units along part of the
' alignment.
oStationRange.StartRange = 10#
oStationRange.EndRange = 1010#
' sample every 200 units along straight lines
oStationRange.IncrementTangent = 200#
' sample every 50 units along curved lines
oStationRange.IncrementCurve = 50#
' sample every 50 units along spiral lines
oStationRange.IncrementSpiral = 50#
' 50 units to either side of the station
oStationRange.SwathWidthLeft = 50#
oStationRange.SwathWidthRight = 50#
oStationRange.SampleLineDefaultDirection = _
aeccDirectionFromBaseAlignment
Set oStationRange.SampleLineStyle = oSampleLineStyle
oSampleLineGroup.SampleLines.AddByStationRange _
"Sample Line 03", _
aeccSampleLineDuplicateActionOverwrite, _
oStationRange
The AeccGroupPlotStyle style controls how groups of section view graphs are
drawn. The style changes the row and column orientation and spacing between
multiple graphs. The collection of all AeccGroupPlotStyle styles is contained
in the AeccDocument.GroupPlotStyles property.
www.EngineeringBooksPdf.com
Sample Line Styles
' This style just changes the display of the sample line.
oSampleLineStyle.LineDisplayStyleSection.color = 140 '
slate
Section Styles
The AeccSectionStyle style controls how surface cross sections are displayed
in the section view graphs. The collection of all AeccSectionStyle styles is
contained in the AeccDocument.SectionStyles property.
www.EngineeringBooksPdf.com
Text labels for sample lines can use any of the following property fields:
Label styles are described in detail in the Chapter 1 section Label Styles (page
211).
Sections
This section covers the creation and use of sections. A section is a cross section
of one or more surfaces along a sample line. A series of sections can be used
to analyze the changes in a surface along a path.
Creating Sections
A section is a cross section of one or more surfaces taken along a sample line.
You can either create sections one at a time using the
AeccSampleLineGroup.CreateSectionsAtSampleLine method, or all at once
using the AeccSampleLineGroup.CreateSectionsAtSampleLines method. These
www.EngineeringBooksPdf.com
methods will cause an error if the sample line group does not reference any
surfaces, or if the surface is not located under the sample lines specified.
Using Sections
Each sample line contains a collection of sections that were based on that
sample line. Each section is represented by object of type AeccSection and
contains methods for retrieving statistics of the surface along the section.
While sections initially have styles based on the AeccSectionStyle style passed
to the AeccSampledSurfaces.Add method, you can also set the style for each
section individually through the AeccSection.Style property.
' For each sample line, go through all the sections that
' were created based on it.
Dim i As Integer
Dim j As Integer
For i = 0 To oSampleLines.Count - 1
Dim oSections As AeccSections
Set oSections = oSampleLines.Item(i).Sections
' For each section, print its highest elevation and set
' some of its properties.
Dim oSection as AeccSection
For Each oSection in oSections
Debug.Print "Max Elevation of "; oSection.Name;
Debug.Print " is: "; oSection.ElevationMax
www.EngineeringBooksPdf.com
oSection.DataType = aeccSectionDataTIN
oSection.StaticDynamic = aeccSectionStateDynamic
Next
Next i
Section Views
This section describes the creation and display of section views. A section view
is a graph of a single section. Usually a series of section views are displayed to
demonstrate a range of cross sections.
Dim i As Integer
Dim j As Integer
www.EngineeringBooksPdf.com
' We have an alignment with sample lines. Loop through
' all the sample line groups in the alignment.
For i = 0 To oAlignment.SampleLineGroups.Count - 1
Dim oSampleLineGroup As AeccSampleLineGroup
Set oSampleLineGroup =
oAlignment.SampleLineGroups.Item(i)
Dim oSampleLines As AeccSampleLines
Set oSampleLines = oSampleLineGroup.SampleLines
' Now loop through all the sample lines in the current
' sample line group. For each sample line, we add a
' section view at a unique location with a style and
' a data band that we defined earlier.
Dim dOffsetRight As Double
dOffsetRight = 0
For j = 0 To oSampleLines.Count - 1
Dim oSectionView As AeccSectionView
dOffsetRight = j * 300
Dim dOriginPt(0 To 2) As Double
' To the right of the surface and the previous
' section views.
dOriginPt(0) = dX + 200 + dOffsetRight
dOriginPt(1) = dY
Set
oSectionView=oSampleLines.Item(j).SectionViews.Add( _
"Section View" & CStr(j), _
"0", _
dOriginPt, _
oSectionViewStyle, _
Nothing) ' "Nothing" means do not display a data
band
Next j
Next i
www.EngineeringBooksPdf.com
New styles are created using the collection’s Add method with the name of
the new style.
www.EngineeringBooksPdf.com
Valid property fields for AeccAxisTitleStyle.Text Axes
Within each axis style are properties for specifying the tick marks placed along
the axis. Both major tick marks and minor tick marks are represented by objects
of type AeccTickStyle. AeccTickStyle manages the location, size, and visual
style of tick marks through its Interval, Size and DisplayStylePlan properties.
NOTE
While most style properties use drawing units, the Interval property uses
surface units.
The AeccTickStyle object also sets what text is displayed at each tick, including
any of the following property fields:
www.EngineeringBooksPdf.com
and AeccGridLines.VerticalPosition properties tell which tick marks to use
to position the grid lines for the axis.
Graph Title
<[Parent Alignment(CP)]>
<[Left Width(Uft|P3|RN|AP|Sn|OF)]>
<[Right Width(Uft|P3|RN|AP|Sn|OF)]>
<[Drawing Scale(P3|RN|AP|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccGraphTitleStyle.Text
'''''''''''''''''''''''''''''''''''''
' Adjust the top axis.
With oSectionViewStyle.TopAxis.MajorTickStyle
.AnnotationDisplayStylePlan.color = 23 ' light brown
.Height = 0.004 ' text height
.AnnotationDisplayStylePlan.Visible = True ' show text
.Interval = 15 ' Major ticks 15 ground units apart
' Each major tick is marked with distance from the
' centerline in meters.
.Text = "<[Section View Point
Offset(Um|P1|RN|Sn|AP|OF)]>m"
.DisplayStylePlan.Visible = True ' show ticks
End With
With oSectionViewStyle.TopAxis.TitleStyle
.DisplayStylePlan.color = 23 ' light brown
.Height = 0.008 ' text height
.Text = "Meters"
' Position the title slightly higher.
dOffset(0) = 0#
dOffset(1) = 0.02
.Offset = dOffset
.DisplayStylePlan.Visible = True ' show title
End With
'''''''''''''''''''''''''''''''''''''
www.EngineeringBooksPdf.com
' Adjust the graph and graph title.
With oSectionViewStyle.GraphStyle
.VerticalExaggeration = 4.1
' The lowest grid with any part of the section
' line in it will have one empty grid between
' it and the bottom axis.
.GridStyle.GridsBelowDatum = 1
' Increase the empty space above the section
' line to make room for any section line labels.
.GridStyle.GridsAboveMaxElevation = 2
Sample Program
SectionSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Section\SectionSample.dvb
This sample program creates a surface from a file and an alignment from a
polyline. Sample lines (using group sample lines, individual sample lines, and
sample lines based on polyline entities) are created across the alignment.
Sections are created from each sample line, and section views of each surface
www.EngineeringBooksPdf.com
cross section are drawn. Styles and label styles for sample lines and section
views are created, as are data bands for the section view graphs.
www.EngineeringBooksPdf.com
Data Bands in COM
Object Hierarchy
www.EngineeringBooksPdf.com
Defining a Data Band Style
This section explains the creation and definition of data band style objects.
These objects are used with profile view and section view graphs and represent
a single band of graphical and text information.
www.EngineeringBooksPdf.com
The bottom of a profile view with four data bands
www.EngineeringBooksPdf.com
A band is described by an object derived from the AeccBandStyle type:
AeccBandSegmentDataStyle, AeccBandProfileDataStyle,
AeccBandHorizontalGeometryStyle, AeccBandVerticalGeometryStyle, or
AeccBandSuperElevationStyle. All such styles in the document are stored in
collections depending on the band type:
Each collection has an Add method for creating new band styles.
The location of information displayed in the band depends on which band
style objects are visible. Each data location (for example, at profile stations or
at horizontal geometry points) consists of multiple style elements (text labels,
tick marks, lines, or blocks). Different band styles have different locations
where information can be displayed, and will display information with
different graphical effects.
Each information location is managed by a set of three style objects that
control:
■ The visual style of the text label (properties ending with
“LabelDisplayStylePlan“, objects of type AeccDisplayStyle).
■ The contents and nature of the text , tick marks, lines, and blocks
(properties ending with “LabelStyle“, objects of type AeccBandLabelStyle).
■ The visual style of the tick mark (properties ending with
“TickDisplayStylePlan“, objects of type AeccDisplayStyle).
www.EngineeringBooksPdf.com
The display styles have priority over the label style when setting the color or
linetype.
NOTE
If either the display style or the label style element is not set to be visible, then
the data element is not visible.
A title can be displayed on the left side of each band. The style of the text and
box around the text are controlled by the
AeccBandStyle.TitleBoxTextDisplayStylePlan and
AeccBandStyle.TitleBoxDisplayStylePlan properties, both object of type
AeccDisplayStyle. The text of the title and its location are controlled through
the AeccBandStyle.TitleStyle property, an object of type
AeccBandTitleStyle. The AeccBandTitleStyle.Text property contains the
actual string to be displayed, which may include property fields from the
following list:
<[Parent Alignment(CP)]>
<[Section1 Name(CP)]>
<[Section1 Type(CP)]>
<[Section2 Name(CP)]>
<[Section2 Type(CP)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccBandTitleStyle.Text
<[Profile1 Name(CP)]>
<[Profile2 Name(CP)]>
The following code sets the title for a section view data band showing two
sections:
oBandSectionDataStyle.TitleStyle.Text = _
"<[Section1 Name(CP)]> and <[Section1 Name(CP)]>"
<[Station Value(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
<[Raw Station(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
<[Profile1 Elevation(Uft|P2|RN|AP|Sn|OF)]>
<[Profile2 Elevation(Uft|P3|RN|AP|Sn|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for use with AeccBandLabelStyle text components
This sample demonstrates the creation of a data band style displaying section
elevation data at two different locations:
With oBandProfileDataStyle
' Add ticks and labels to each horizontal
' geography location.
.HGPLabelDisplayStylePlan.Visible = True
.HGPTickDisplayStylePlan.Color = 10 ' red
.HGPTickDisplayStylePlan.Visible = True
.HGPLabelStyle.TextComponents.Item(0).Contents = _
"<[Station Value(Uft|FS|P0|RN|AP|Sn|TP|B2|EN|W0|OF)]>"
.HGPLabelStyle.TextComponents.Item(0).Color = 11 ' red
.HGPLabelStyle.TextComponents.Item(0).Visibility = True
www.EngineeringBooksPdf.com
Visibility = False
.MinorStationLabelDisplayStylePlan.Visible = False
.MinorTickDisplayStylePlan.Visible = False
.VGPLabelDisplayStylePlan.Visible = False
.VGPTickDisplayStylePlan.Visible = False
.StationEquationLabelStyle.TextComponents.Item(0). _
Visibility = False
.StationEquationLabelDisplayStylePlan.Visible = True
.StationEquationTickDisplayStylePlan.Visible = True
End With
This style produces a data band that looks like this:
www.EngineeringBooksPdf.com
Each label style can use any of the following property fields:
<[Length(Uft|P2|RN|Sn|OF|AP)]>
<[Tangent Direction(Udeg|FDMSdSp|MB|P6|RN|DSn|CU|AP|OF)]>
<[Start Station(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
<[Start Easting(Uft|P4|RN|AP|Sn|OF)]>
<[Start Northing(Uft|P4|RN|AP|Sn|OF)]>
<[End Station(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
<[End Easting(Uft|P4|RN|AP|Sn|OF)]>
<[End Northing(Uft|P4|RN|AP|Sn|OF)]>
With oBandHorizontalGeometryStyle
' Add displays and labels for alignment tangents.
.TangentGeometryDisplayStylePlan.Visible = True
.TangentGeometryDisplayStylePlan.Color = 160 ' blue
.TangentLabelDisplayStylePlan.Visible = True
.TangentLabelStyle.TextComponents.Item(0).Contents =
_
"Length = <[Length(Uft|P2|RN|Sn|OF|AP)]>"
.TangentLabelStyle.TextComponents.Item(0).Color = 120
.TangentLabelStyle.TextComponents.Item(0). _
Visibility = True
www.EngineeringBooksPdf.com
' Add displays and labels for alignment curves.
.CurveGeometryDisplayStylePlan.Visible = True
.CurveGeometryDisplayStylePlan.Color = 160 ' blue
.CurveLabelDisplayStylePlan.Visible = True
.CurveLabelStyle.TextComponents.Item(0).Contents = _
"Length = <[Length(Uft|P2|RN|Sn|OF|AP)]>"
.CurveLabelStyle.TextComponents.Item(0).Color = 120
.CurveLabelStyle.TextComponents.Item(0). _
Visibility = True
www.EngineeringBooksPdf.com
Vertical Geometry Data Band Style
The AeccBandProfileDataStyle type is used to display features of the vertical
geometry of alignments in profile views. The style of graphical markers
displayed at each curve and tangent segment can be modified, as well as the
labels placed at crest, sag, uphill, and downhill segments of the profile.
Downhill and uphill labels can use any of the following property fields:
<[Tangent Grade(FP|P2|RN|AP|Sn|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for use with AeccBandLabelStyle text components
This sample demonstrates the creation of a data band style displaying the
direction of slope for all segments of a profile with a title:
Dim oBandVerticalGeometryStyle As
AeccBandVerticalGeometryStyle
Set oBandVerticalGeometryStyle =
oDocument.ProfileViewBandStyles _
.VerticalGeometryBandStyles.Add("Vertical Band")
With oBandVerticalGeometryStyle
' Add graphical marks that show the uphill or downhill
' directions and the lengths of the vertical segments
' of the profile. On uphill sections the label of the
' length of the segment will be in white, on downhill
' it will be pale yellow. The graphical element that
' shows direction will be pink.
.DownhillTangentLabelStyle.TextComponents.Item(0).
Contents = "<[Tangent Horizontal Length(Uft|P2)]>"
.DownhillTangentLabelStyle.TextComponents.Item(0). _
Color = 51 ' pale yellow
.DownhillTangentLabelStyle.TextComponents.Item(0). _
Visibility = True
.UphillTangentLabelStyle.TextComponents.Item(0).
Contents = "<[Tangent Horizontal Length(Uft|P2)]>"
.UphillTangentLabelStyle.TextComponents.Item(0). _
Color = 255 ' white
.UphillTangentLabelStyle.TextComponents.Item(0). _
Visibility = True
.TangentGeometryDisplayStylePlan.Color = 220 ' pink
.TangentGeometryDisplayStylePlan.Visible = True
www.EngineeringBooksPdf.com
.TangentLabelDisplayStylePlan.Visible = True
.TangentGeometryDisplayStylePlan.Visible = True
www.EngineeringBooksPdf.com
lines, the distance above or below the centerline representing the amount of
slope. The superelevation elements that can be represented this way are:
■ Left inside pavement
■ Left inside shoulder
■ Left outside pavement
■ Left outside shoulder
■ Right inside pavement
■ Right inside shoulder
■ Right outside pavement
■ Right outside shoulder
You can also display a reference line through the center of the data band to
help users interpret the element lines.
The data band can also display tick marks and text labels at points of change
in the superelevation of the alignment. The following can be marked on the
data band:
■ Full superelevation
■ Level crown
■ Normal crown
■ Reverse crown
■ Shoulder break over
■ Transition segment
The label styles for text labels can use any of the following property fields:
<[Station Value(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for use with AeccBandLabelStyle text components
This sample demonstrates the creation of a data band style displaying the
slopes of the outside shoulders - the right shoulder in yellow and the left in
blue. A gray reference line is also added.
With oBandSuperElevationStyle
' Add graphical display of the slope of the left and
right
' outside shoulders. If the line is above the
centerline,
' then the slope is positive.
.LeftOutsideShoulderLineDisplayStylePlan.Visible = True
.LeftOutsideShoulderLineDisplayStylePlan.color = 151
' Color 151 = pale blue
.RightOutsideShoulderLineDisplayStylePlan.Visible = True
.RightOutsideShoulderLineDisplayStylePlan.color = 51
' Color 51 = pale yellow
www.EngineeringBooksPdf.com
' Modify how the title is displayed.
.TitleBoxDisplayStylePlan.color = 10 ' red
.TitleBoxDisplayStylePlan.Linetype = "DOT"
.TitleBoxDisplayStylePlan.Visible = True
.TitleBoxTextDisplayStylePlan.color = 80 ' green
.TitleBoxTextDisplayStylePlan.Visible = True
.TitleStyle.Text = "Profile Geometry"
.TitleStyle.TextHeight = 0.0125
.TitleStyle.TextBoxWidth = 0.21
www.EngineeringBooksPdf.com
Section Data Band Style
Data bands for section views are described by an object of type
AeccBandSectionDataStyle. Information in this data band can be displayed
at major and minor tick marks, at the centerline, at each section grade break,
and at each sample line vertex. The centerline is the location where the sample
line crosses the alignment. If the sample line does not cross the alignment,
the centerpoint is where the sample line would cross the alignment if the
sample line were extended. Unless the AeccSampleLines.AddByPolyline
method was used to create a multi-segment sample line, placing information
at each sample line vertex simply places tick marks and labels at the section
endpoints.
Each label style can use any of the following property fields:
www.EngineeringBooksPdf.com
Valid property fields for use with AeccBandLabelStyle text components
<[Section1 Elevation(Uft|P3|RN|AP|Sn|OF)]>
<[Section2 Elevation(Uft|P3|RN|AP|Sn|OF)]>
This sample demonstrates the creation of a data band style displaying section
elevation data at two different locations:
' Display at every major grid line a tick mark and a label
' that shows the section elevation at that point.
With oBandSectionDataStyle
.MajorOffsetLabelDisplayStylePlan.Color = 255 ' white
.MajorOffsetLabelDisplayStylePlan.Visible = True
.MajorOffsetTickDisplayStylePlan.Color = 255 ' white
.MajorOffsetTickDisplayStylePlan.Visible = True
End With
With oBandSectionDataStyle.MajorIncrementLabelStyle. _
TextComponents.Item(0)
.Contents = "<[Section1 Elevation(Um|P3|RN|AP|Sn|OF)]>m"
.Color = 255 ' white
.Visibility = True
' Shift the label to the high side of the band.
.YOffset = 0.015
www.EngineeringBooksPdf.com
End With
' Display a red tick mark and a red label showing section
www.EngineeringBooksPdf.com
Creating a Data Band Set
This section explains data band sets, which are groups of individual data bands
displayed around a profile view or section view graph.
www.EngineeringBooksPdf.com
Data band sets are used when profile views are first created. The following
sample code is taken from the topic Creating a Profile View (page 303), but this
time a data band set is passed in the last parameter.
The following example demonstrates creating a section band style set and
adding a band style to it:
Set oSectionView=oSampleLines.Item(j).SectionViews.Add( _
"Section View" & CStr(j), _
"0", _
dOriginPt, _
www.EngineeringBooksPdf.com
oSectionViewStyle, _
oSectionViewBandStyleSet)
TIP
If you only want to display information from a single profile in the band, pass
the same profile object to both parameters.
The order of bands in the band set is also the order in which the bands are
displayed. AeccProfileViewBandSet.Add places the new band at the bottom
of the list while AeccProfileViewBandSet.Insert places the new band at the
specified index.
TIP
You can swap the location of two bands with the
AeccProfileViewBandSet.Swap method.
This sample adds a data band to a profile view that describes the single profile
“oProfile” based on the alignment “oAlignment”:
www.EngineeringBooksPdf.com
oProfile, _
oProfile)
TIP
If you only want to display a single section in the band, pass the same section
object to both parameters.
The order of bands in the band set is also the order in which the bands are
displayed. AeccSectionViewBandSet.Add places the new band at the bottom
of the list while AeccSectionViewBandSet.Insert places the new band at the
specified index.
TIP
You can swap the location of two bands with the
AeccSectionViewBandSet.Swap method.
This sample adds a data band to a section view that describes the single section
“oSection”:
www.EngineeringBooksPdf.com
Sample Programs
Profiles.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Profile\ProfileSample.dvb
See the ProfileViewStyle module for an example of the creation of a data
band style, the definition of a data band style set, and the use of that data
band set with a profile view.
Sections.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Section\SectionSample.dvb
See the SectionViewStyle module for an example of the creation of a data
band style, the definition of a data band style set, and the use of that data
band set with a section view.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
Pipe Network Object Model
Base Objects
This section explains how to get the base objects required for using the pipe
network API classes.
www.EngineeringBooksPdf.com
structure parts held in the document. Ambient settings for a pipe document
are held in the AeccPipeDocument.Settings property, an object of type
AeccPipeSettingsRoot. AeccPipeSettingsRoot inherits all the properties of
the AeccSettingsRoot class.
Among the properties of AeccPipeSettingsRoot are InterferenceSettings,
PipeSettings, and StructureSettings. Each of these properties consist of an
AeccSettingsAmbient object, which describes the default units of measurement
for interference, pipe, and structure objects. The
AeccPipeSettingsRoot.PipeNetworkSettings property contains the name of
the default styles for pipe and structure objects as well as the default label
placement, units, and naming conventions for pipe networks as a whole.
' Get the default set of pipe rules used in this document.
With oSettings.PipeNetworkSettings.RulesSettings
Debug.Print "Using pipe rules:"; .PipeDefaultRules.Value
End With
' Set the default units used for pipes in this document.
With oSettings.PipeSettings.AmbientSettings
.AngleSettings.Unit = aeccAngleUnitRadian
.CoordinateSettings.Unit = aeccCoordinateUnitFoot
.DistanceSettings.Unit = aeccCoordinateUnitFoot
End With
The AeccPipeSettingsRoot object also has a
PipeNetworkCommandsSettingsproperty, which contains properties that affect
pipe network-related commands. Each sub-property contains an
AmbientSettings property which describes the default units of measurement
for interference, pipe, and structure objects, plus other properties specific to
the command.
www.EngineeringBooksPdf.com
of the value, a global context used to identify the field, data type, and the
data value itself.
This sample enumerates all the data fields contained in a pipe object “oPipe”
and displays information from each field.
Once a parameter has been created, it can be made into a property available
for use in parts through the AeccPipeNetworkCatDef.DeclarePartProperty
method.
NOTE
The parameter name cannot contain spaces or punctuation characters.
www.EngineeringBooksPdf.com
This sample demonstrates declaring a parameter and making a property based
on that parameter available to any pipe objects:
oPipeNetworkCatDef.DeclarePartProperty
"Global Context 01", aeccDomPipe, 10
You can now choose from among those properties available to the part’s
domain and create a data field.
www.EngineeringBooksPdf.com
a read-only collection of part filters (AeccPartSizeFilter), which are the
particular sizes of parts. A part filter is defined by its
AeccPartSizeFilter.PartDataRecord property, a collection of fields describing
various aspects of the part.
This sample prints the complete listing of all parts in a document.
Debug.Print: Debug.Print
Debug.Print "PART LIST - "; oPartList.Name
Debug.Print "-------------------------------------------"
' From the part list, looking at only those part families
' that are pipes, print all the individual parts.
Debug.Print " Pipes"
Debug.Print " ====="
For Each oPartFamily In oPartList
' Look for only pipe families.
If (oPartFamily.Domain = aeccDomPipe) Then
sPipeGuid = oPartFamily.guid
Debug.Print " Family: "; oPartFamily.Name
' Go through each part in this family.
For Each oPipeFilter In oPartFamily.SizeFilters
Debug.Print " Part: "; oPipeFilter.Name
Next
End If
Next
www.EngineeringBooksPdf.com
' From the part list, looking at only those part families
' that are structures, print all the individual parts.
Debug.Print
Debug.Print " Structures"
Debug.Print " =========="
For Each oPartFamily In oPartList
' Look for only structure families.
If (oPartFamily.Domain = aeccDomStructure) Then
sStructureGuid = oPartFamily.guid
Debug.Print " Family: "; oPartFamily.Name
' Go through each part in this family.
For Each oPipeFilter In oPartFamily.SizeFilters
Debug.Print " Part: "; oPipeFilter.Name
Next
End If
Next
Next
www.EngineeringBooksPdf.com
' Create a new pipe network
Set oPipeNetwork = oPipeNetworks.Add("Network Name")
Pipes
This section explains the creation and use of pipes. Pipes represent the conduits
within a pipe network.
Creating Pipes
Pipe objects represent the conduits of the pipe network. Pipes are created using
the pipe network’s AeccPipeNetwork.Pipes collection. This collection has
methods for creating either straight or curved pipes. Both methods require
you to specify a particular part family (using the GUID of a family) and a
particular part size filter object as well as the starting and ending points of
the pipe. The order of the start and end points may have meaning in describing
flow direction.
This sample creates a straight pipe between two hard-coded points using the
first pipe family and pipe size filter it can find in the part list:
' Go through the list of part types and select the first
' pipe found.
Set oSettings = oPipeDocument.Settings
' Get all the parts list in the drawing.
Set oPartLists = oSettings.PartLists
' Get the first part list found.
Set oPartList = oPartLists.Item(0)
For Each oPartFamily In oPartList
' Look for a pipe family.
If (oPartFamily.Domain = aeccDomPipe) Then
sPipeGuid = oPartFamily.guid
' Get the first size filter list from the family.
www.EngineeringBooksPdf.com
Set oPipeFilter = oPartFamily.SizeFilters.Item(0)
Exit For
End If
Next
Using Pipes
To make a new pipe a meaningful part of a pipe network, it must be connected
to structures or other pipes using the AeccPipe.ConnectToStructure or
AeccPipe.ConnectToPipe methods, or structures must be connected to it using
the AeccStructure.ConnectToPipe method. Connecting pipes together directly
creates a new virtual AeccStructure object to serve as the joint. If a pipe end
is connected to a structure, it must be disconnected before attempting to
connect it to a different structure. After a pipe has been connected to a
network, you can determine the structures at either end by using the
StartStructure and EndStructure properties or by using the Connections
property, which is a read-only collection of network parts. There are methods
and properties for setting and determining the flow direction, getting all types
of physical measurements, and for accessing collections of user-defined
properties for custom descriptions of the pipe.
www.EngineeringBooksPdf.com
Creating Pipe Styles
A pipe style controls the visual appearance of pipes in a document. All pipe
style objects in a document are stored in the AeccPipeDocument.PipeStyles
collection. Pipe styles have four display methods and three hatch methods
for controlling general appearance attributes and three properties for
controlling display attributes that are specific to pipes. The methods
DisplayStyleModel|Profile|Section|Plan, and
HatchStylePlan|Profile|Section all take a parameter describing the feature
being modified, and return a reference to the AeccDisplayStyle or
AeccHatchDisplayStyle object controlling common display attributes, such
as line styles and color. The properties PlanOption and ProfileOption set the
size of the inner wall, outer wall, and end lines according to either the physical
properties of the pipe, a custom sizes using drawing units, or a certain
percentage of its previous drawing size. The HatchOption property sets the
area of the pipe covered by any hatching used. A pipe object is given a style
by assigning the AeccPipe.Style property to a AeccPipeStyle object.
This sample creates a new pipe style object, sets some of its properties, and
assigns it to a pipe object:
www.EngineeringBooksPdf.com
' Modify the colors of pipes using this style when shown
in
' plan view.
oPipeStyle.DisplayStylePlan(aeccDispCompPipeOutsideWalls)
_
.Color = 40 ' orange
oPipeStyle.DisplayStylePlan(aeccDispCompPlanInsideWalls)
_
.Color = 255 ' white
oPipeStyle.DisplayStylePlan(aeccDispCompPipeEndLine) _
.color = 255 ' white
NOTE
The label style of a particular pipe cannot be set using the API.
Pipe label styles can use the following property fields in the contents of any
text component.
<[Wall Thickness(Uin|P3|RN|AP|Sn|OF)]>
<[Material(CP)]>
<[Manning Coefficient(P3|RN|AP|Sn|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccLabelStyleTextComponent.Contents in pipes
<[Name(CP)]>
<[Description(CP)]>
<[Network Name(CP)]>
<[Start Offset(Uft|P3|RN|AP|Sn|OF)]>
<[End Offset(CP)]>
<[Pipe Slope(FP|P2|RN|AP|Sn|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccLabelStyleTextComponent.Contents in pipes
<[Pipe Bearing(Udeg|FDMSdSp|MB|P6|RN|DSn|CU|AP|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccLabelStyleTextComponent.Contents in pipes
<[Pipe Radius(Uft|P3|RN|AP|Sn|OF)]>
<[Minimum Cover(Uft|P3|RN|AP|Sn|OF)]>
<[Maximum Cover(Uft|P3|RN|AP|Sn|OF)]>
Structures
This section describes the creation and use of structures. Structures are the
connectors within a pipe network.
www.EngineeringBooksPdf.com
Creating Structures
Structures represent physical objects such as manholes, catch basins, and
headwalls. Logically, structures are used as connections between pipes at pipe
endpoints. In cases where two pipes connect directly, an AeccStructure object
not representing any physical object is still created to serve as the joint. Any
number of pipes can connect with a structure. Structures are represented by
objects of type AeccStructure, which are created by using the Add method of
the Surfaces collection of AeccPipeNetwork.
This sample uses the first structure family and size filter it can find in the part
list and creates a new structure based on that part type.
' Go through the list of part types and select the first
' structure found.
Set oSettings = oPipeDocument.Settings
' Get all the parts list in the drawing.
Set oPartLists = oSettings.PartLists
' Get the first part list found.
Set oPartList = oPartLists.Item(0)
For Each oPartFamily In oPartList
' Look for a structure family that is not named
' "Null Structure".
If (oPartFamily.Domain = aeccDomStructure) And _
(oPartFamily.Name = "Null Structure") Then
sStructureGuid = oPartFamily.guid
' Get the first size filter list from the family.
Set oStructureFilter = oPartFamily.SizeFilters.Item(0)
Exit For
End If
Next
www.EngineeringBooksPdf.com
' Assuming a valid AeccNetwork object "oNetwork".
Set oStructure = oNetwork.Structures.Add( _
sStructureGuid, _
oStructureFilter, _
dPoint, _
5.2333) ' 305 degrees in radians
Using Structures
To make the new structure a meaningful part of a pipe network, it must be
connected to pipes in the network using the AeccStructure.ConnectToPipe
method or pipes must be connected to it using the
AeccPipe.ConnectToStructure method. After a structure has been connected
to a network, you can determine the pipes connected to it by using the
Connections property, which is a read-only collection of network parts. There
are also methods and properties for setting and determining all types of
physical measurements for the structure and for accessing collections of
user-defined properties for custom descriptions of the structure.
www.EngineeringBooksPdf.com
appearance attributes and three properties for controlling display attributes
that are specific to structures. The methods
DisplayStylePlan|Profile|Section|Model and
HatchStylePlan|Profile|Section all take a parameter describing the feature
being modified and return a reference to the AeccDisplayStyle or
AeccHatchDisplayStyle object controlling common display attributes such
as line styles and color. The properties PlanOption, ProfileOption, and
ModelOption set the display size of the structure and whether the structure is
shown as a model of the physical object or only symbolically. A structure
object is given a style by assigning the AeccStructure.Style property to a
AeccStructureStyle object.
This sample creates a new structure style object, sets some of its properties,
and assigns it to a structure object:
oStructureStyle.DisplayStylePlan(aeccDispCompStructure).color
= 30
oStructureStyle.PlanOption.MaskConnectedObjects = True
NOTE
The label style of a particular structure cannot be set using the API.
www.EngineeringBooksPdf.com
Structure label styles can use the following property fields in the contents of
any text component:
<[Name(CP)]>
<[Description(CP)]>
<[Network Name(CP)]>
<[Structure Station(Uft|FS|P2|RN|AP|Sn|TP|B2|EN|W0|OF)]>
<[Structure Offset(Uft|P3|RN|AP|Sn|OF)]>
<[Connected Pipes(Sn)]>
<[Structure Northing(Uft|P4|RN|AP|Sn|OF)]>
<[Structure Easting(Uft|P4|RN|AP|Sn|OF)]>
<[Sump Elevation(Uft|P3|RN|AP|Sn|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccLabelStyleTextComponent.Contents in struc-
tures
<[Sump Depth(P3|RN|AP|Sn|OF)]>
<[Structure Shape(CP)]>
<[Wall Thickness(Uin|P3|RN|AP|Sn|OF)]>
<[Floor Thickness(Uin|P3|RN|AP|Sn|OF)]>
<[Material(CP)]>
<[Frame(CP)]>
<[Grate(CP)]>
<[Cover(CP)]>
<[Frame Height(Uin|P3|RN|AP|Sn|OF)]>
<[Frame Diameter(Uin|P3|RN|AP|Sn|OF)]>
<[Frame Length(Uin|P3|RN|AP|Sn|OF)]>
<[Frame Width(Uin|P3|RN|AP|Sn|OF)]>
<[Barrel Height(Uft|P3|RN|AP|Sn|OF)]>
www.EngineeringBooksPdf.com
Valid property fields for AeccLabelStyleTextComponent.Contents in struc-
tures
<[Cone Height(Uin|P3|RN|AP|Sn|OF)]>
<[Slab Thickness(Uin|P3|RN|AP|Sn|OF)]>
Interference Checks
This section explains how to generate and examine an interference check. An
interference check is used to determine when pipe network parts are either
intersecting or are too close together.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
Performing an Interference Check
An interference check is used to detect intersections between the pipe parts
of two different pipe networks or of pipes of a single network with themselves.
The collection of all interference checks, an object of type
AeccInterferenceChecks, is contained in the document’s
AeccPipeDocument.InterferenceChecks property. A new interference check
is made using the AeccInterferenceChecks.Create method, which requires
an AeccInterferenceCheckCreationData parameter. The creation data object
holds all the information needed to perform the check, including the type of
check to perform, the distance between parts required for an interference, and
the pipe networks being checked. A new creation data object can only be made
using the AeccInterferenceChecks.GetDefaultCreationData method. A valid
check requires at least the Name, LayerName, SourceNetwork and TargetNetwork
properties of the creation data object to be set.
The following sample performs an interference check between two networks:
www.EngineeringBooksPdf.com
oCreationData.LayerName = oPipeDocument.Layers.Item(0).Name
www.EngineeringBooksPdf.com
Debug.Print " "; sLocation
Next
If (oInterferenceCheck.Count = 0) Then
MsgBox "There are no interferences in the network."
End If
www.EngineeringBooksPdf.com
visible. The style property MarkerStyle, an object of type AeccMarkerStyle,
controls all aspects of how the symbol is drawn.
This sample creates a new interference style object that displays an X symbol
with a superimposed circle at points of intersection:
Sample Program
PipeSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Pipe\PipeSample.dvb
The sample code from this chapter can be found in context in the
PipeSample.dvb project. This sample creates a simple pipe network, creates
and applies a new style, and performs an interference check.
www.EngineeringBooksPdf.com
Corridors in COM
This chapter covers creating and managing corridor objects using the COM
API. For information about performing these tasks using the .NET API, see
Corridors in .NET (page 108).
Root Objects
This section explains how to get the base objects required for using the roadway
API classes.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
Accessing Corridor-Specific Base Objects
Applications that access corridors require special versions of the base objects
representing the application and document. The AeccRoadwayApplication
object is identical to the AeccApplication it is inherited from except that its
AeccRoadwayApplication.ActiveDocument property returns an object of type
AeccRoadwayDocument instead of AeccDocument. The AeccRoadwayDocument
object contains collections of road related items, such as corridors,
subassemblies, and style objects in addition to all of the methods and properties
of AeccDocument.
When using corridor root objects, be sure to reference the “Autodesk Civil
Engineering Corridor 6.0 Object Library” (AeccXRoadway.tlb) and “Autodesk
Civil Engineering UI Corridor 6.0 Object Library” (AeccXUIRoadway.tlb)
libraries.
This sample demonstrates how to retrieve the corridor root objects:
Ambient Settings
Ambient settings allow you to get and set the unit and default property settings
of roadway objects. Ambient settings for a corridor document are held in the
AeccRoadwayDocument.Settings property, an object of type
AeccRoadwaySettingsRoot. AeccRoadwaySettingsRoot inheirits all the
properties of the AeccSettingsRoot class from which it is derived.
The roadway-specific properies of AeccRoadwaySettingsRoot let you adjust
the settings for corridors, assemblies, subassemblies, and quantity takeoffs:
www.EngineeringBooksPdf.com
Corridor Ambient Settings
The corridor ambient settings object allows you to set the default name
templates and default styles for corridor-related objects. The name templates
allow you to set how new corridors, corridor surfaces, profiles from feature
lines, or alignments from feature lines are named. Each template can use
elements from the following property fields:
<[Next Counter(CP)]>
<[Corridor Name(CP)]>
...for AeccSettingsCorridor.ProfileFromFeatureLineNameTemplate
<[Next Counter(CP)]>
<[Corridor Name(CP)]>
<[Next Counter(CP)]>
www.EngineeringBooksPdf.com
... for AeccSettingsCorridor.AlignmentFromFeatureLineNameTemplate
<[Profile Type]>
www.EngineeringBooksPdf.com
Assembly Ambient Settings
The assembly ambient settings object allows you to set the default name
templates and default styles for assemblies. The name templates allow you to
set how new assemblies, offset assemblies, and assembly groups are named.
Each template can use elements from the following property fields:
<[Next Counter(CP)]>
<[Corridor Name(CP)]>
...for AeccSettingsAssembly.GroupNameTemplate
<[Next Counter(CP)]>
The subassembly ambient settings object allows you to set the default name
templates and default styles for subassembly objects. The name templates
allow you to set how subassemblies created from entities and subassemblies
create from macros are named. Each template can use elements from the
following property fields:
<[Next Counter(CP)]>
www.EngineeringBooksPdf.com
... for AeccSettingsSubassembly.CreateFromEntitiesNameTemplate
<[Subassembly Side]>
<[Next Counter(CP)]>
<[Subassembly Side]>
The name of the default code style set is accessed through the
AeccSettingsSubassembly.CodeSetStyle string property.
Corridors
Corridor Concepts
A corridor represents a path, such as a road, trail, railroad, or airport runway.
The geometry of a corridor is defined by a horizontal alignment and a profile.
Together, these form the baseline - the centerline of the 3D path of the
corridor. Along the length of the baselines are a series of assemblies which
define the cross-sectional shape of the alignment. Common points in each
assembly are connected to form feature lines. Together the assemblies and
feature lines form the 3D shape of a corridor. A corridor also has one or more
surfaces which can be compared against an existing ground surface to
determine the amount of cut or fill required.
www.EngineeringBooksPdf.com
Listing Corridors
The collection of all corridors in a document are held in the
AeccRoadwayDocument.Corridors property.
The following sample displays the name and the largest possible triangle side
of every corridor in a document:
Creating Corridors
The corridors collection includes a AeccCorridors.Add method for creating
new corridors. This method creates the corridor based on an existing alignment,
profile, and assembly.
NOTE
The station distance between assemblies cannot be set through the API, and
needs to be set through the property page dialog box before the
AeccCorridors.Add method is called.
www.EngineeringBooksPdf.com
Baselines
A baseline represents the centerline of the path of a corridor. It is based on an
alignment (the horizontal component of the path) and a profile (the vertical
component of the path). A corridor can contain more than one baseline if the
corridor is modeling a complicated shape, such as an intersection. A baseline
is made up of one or more baseline regions. Each region has its own assembly
(its own cross section), so a corridor can have different shapes at different
locations along its length.
Object Hierarchy
www.EngineeringBooksPdf.com
Listing Baselines in a Corridor
The collection of all baselines in a corridor are contained in the
AeccCorridor.Baselines property.
NOTE
The station distance between assemblies cannot be set through the API, and
needs to be set through the property page dialog box before this method is
called.
www.EngineeringBooksPdf.com
Listing Baseline Regions
The collection of all the regions of a baseline are contained in the
AeccBaseline.BaselineRegions property.
The AutoCAD Civil 3D API does not include methods for creating new baseline
regions or manipulating existing regions.
The following sample displays the start and end station for every baseline
region in a baseline:
Dim v As Variant
v = oBaselineRegion.GetSortedStations()
Dim i As Integer
Debug.Print "Assembly stations:"
For i = 0 To UBound(v)
Debug.Print v(i)
Next i
New stations can be added to baselines and baseline regions using the
AddStation method. Existing stations can be deleted using the DeleteStation
method. DeleteStation includes an optional tolerance parameter, letting
you specify a station within a range. You can list all of the stations added to
a baseline region with the AeccBaselineRegion.GetAdditionalStation
www.EngineeringBooksPdf.com
method. AeccBaselineRegion.ClearAdditionalStations removes all added
stations within a baseline region and leaves only the original stations created
at regular intervals.
' Remove the station located within 0.1 units around 5+67.5
oBaseline.DeleteStation 567.5, 0.1
NOTE
The AutoCAD Civil 3D API does not include methods for creating new offset
baselines or hardcoded offset baselines.
www.EngineeringBooksPdf.com
dMainStart =
oOffsetBaseline.StartStationOnMainBaseline
dMainEnd = oOffsetBaseline.EndStationOnMainBaseline
Debug.Print "Offset baseline, station " & dMainStart
& _
" to " & dMainEnd
Case aeccCorridorHardcodedOffsetBaseline
Dim oHardcodedOffsetBaseline As
AeccHardcodedOffsetBaseline
Set oHardcodedOffsetBaseline = oBaseBaseline
www.EngineeringBooksPdf.com
define the cross-section of a corridor, a series of applied assemblies (an object
of type AeccAppliedAssembly) is added to the corridor. Each applied assembly
consists of a collection of applied subassemblies, which in turn consist of
shapes, links, and points that have been positioned relative to a specific station
along the corridor baseline (AeccCalcualtedShapes, AeccCalculatedLinks,
and AeccCalculatedPoints respectively). An applied assembly also has direct
access to all the calculated shapes, links, and points of its constituent applied
subassemblies.
NOTE
The AutoCAD Civil 3D API does not include methods for creating or modifying
assemblies.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
Assemblies and Subassemblies Object Model
www.EngineeringBooksPdf.com
Getting Applied Subassembly Information
An applied subassembly consists of a series of calculated shapes, links, and
points, represented by objects of type AeccCalculatedShape,
AeccCalculatedLink, and AeccCalculatedPoint respectivly.
Dim S, O, E As Double
With oAppliedSubassembly
S = .OriginStationOffsetElevationToBaseline(0)
O = .OriginStationOffsetElevationToBaseline(1)
E = .OriginStationOffsetElevationToBaseline(2)
End With
Debug.Print "Station to baseline : " & S
Debug.Print "Offset to baseline : " & O
Debug.Print "Elevation to baseline : " & E
Applied subassemblies also contain a reference to the archetype subassembly
(of type AeccSubassembly) in the subassembly database.
Feature Lines
Feature lines are formed by connecting related points in each assembly along
the length of a corridor baseline. These lines represent some aspect of the
roadway, such as a sidewalk edge or one side of a corridor surface. Points
become related by sharing a common code, a string property usually describing
the corridor feature.
Each baseline has two sets of feature lines, one for lines that are positioned
along the main baseline and one for lines that are positioned along any of
the offset baselines.
NOTE
You can create feature lines from polylines using the IAeccLandFeatureLine::
AddFromPolyline() method.
www.EngineeringBooksPdf.com
Object Hierarchy
www.EngineeringBooksPdf.com
Listing Feature Lines Along a Baseline
The set of all feature lines along a main baseline are held in the
AeccBaseline.MainBaselineFeatureLines property, an object of type
AeccBaselineFeatureLines. This object contains information about all the
feature lines, such as a list of all codes used. Its
AeccBaselineFeatureLines.FeatureLinesCol property is a collection of
collections of feature lines. Each feature line (an object of type
AeccFeatureLine) contains the code string used to create the feature line and
a collection of all feature line points.
This sample lists all the feature line collections and feature lines along the
main baseline. It also lists the code and every point location for each feature
line.
www.EngineeringBooksPdf.com
X = oFeatureLinePoint.XYZ(0)
Y = oFeatureLinePoint.XYZ(1)
Z = oFeatureLinePoint.XYZ(2)
Debug.Print "Point: " & X & ", " & Y & ", " & Z
Next ' Points in a feature line
Next ' Feature lines
Next ' Collections of feature lines
' [...]
' This section is the same as the previous topic.
www.EngineeringBooksPdf.com
Each offset baseline and hardcoded offset baseline also has direct access to the
feature lines related to itself. The AeccBaselineFeatureLines collection is
accessed through the RelatedOffsetBaselineFeatureLines property in both
types of offset baselines.
Corridor Surfaces
Corridor surfaces can represent the base upon which the corridor is constructed,
the top of the finished roadway, or other aspects of the corridor. Such surfaces
are represented by the AeccSurface class and by the unrelated
AeccCorridorSurface class. AeccCorridorSurface objects contain
corridor-specific information about the surfaces, such as which feature line,
point, and link codes were used to create it.
NOTE
The AutoCAD Civil 3D API does not include methods for creating new corridor
surfaces or modifying existing corridor surfaces.
This sample lists all the corridor surfaces within a corridor and specifies which
point codes were used:
www.EngineeringBooksPdf.com
For i = 0 To UBound(sCodes)
sCodeList = sCodeList & " " & sCodes(i)
Next i
Debug.Print "Point codes: " & sCodeList
Next
NOTE
The AutoCAD Civil 3D API does not include methods for creating or modifying
corridor boundaries or masks.
This sample loops through all the boundaries of a corridor surface and displays
information about each:
www.EngineeringBooksPdf.com
End If
Debug.Print sBoundaryTitle & oCSBoundary.Name
www.EngineeringBooksPdf.com
cannot be used with AeccSurface objects directly to compute such statistics,
each AeccCorridorSurface object also has a companion AeccSurface object
of the same name.
This sample code demonstrates the creation of a volume surface from the
difference between the existing ground and the datum surface of a corridor
to determine cut, fill, and volume statistics:
www.EngineeringBooksPdf.com
dCutVol = oTinVolumeSurface.Statistics.CutVolume
dFillVol = oTinVolumeSurface.Statistics.FillVolume
MsgBox "Net Volume = " & dNetVol & " cu.m" & _
vbNewLine & "Cut = " & dCutVol & " cu.m" & _
vbNewLine & "Fill = " & dFillVol & " cu.m", _
vbOKOnly, _
"Differences between """ & _
oTinVolumeCreationData.BaseSurface.Name & _
""" and """ & _
oTinVolumeCreationData.ComparisonSurface.Name & _
""""
Styles
These style objects control the visual appearance of applied assemblies.
Assembly Style
The collection of all assembly style objects are found in the
AeccRoadwayDocument.AssemblyStyles property. The assembly style object
contains properties for adjusting the marker types for the assembly attachment
points, each of the standard AeccMarkerType property. While you can create
new styles and edit existing styles, you cannot assign a style to an existing
assembly using the AutoCAD Civil 3D API.
www.EngineeringBooksPdf.com
Link Style
The collection of all link style objects are found in the
AeccRoadwayDocument.LinkStyles property. This style object contains
properties for adjusting the visual display of assembly and subassembly links.
NOTE
Link style objects are not used directly with link objects, but are instead used
with roadway style sets.
Shape Style
The collection of all shape style objects are found in the
AeccRoadwayDocument.ShapeStyles property. This style object contains
properties for adjusting the visual display of assembly and subassembly shapes,
including the outline and the inside area.
NOTE
Shape style objects are not used directly with shape objects, but are instead
used with roadway style sets.
www.EngineeringBooksPdf.com
.AreaFillHatchDisplayStylePlan.Pattern = "LINE"
.BorderDisplayStylePlan.color = 30 ' orange
.BorderDisplayStylePlan.Visible = True
End With
' Assign our new style set as the style set in current use.
oStyleSet.InitAsCurrent
www.EngineeringBooksPdf.com
Sample Program
CorridorSample.dvb
<installation-directory>\Sample\Civil 3D
API\Vba\Corridor\CorridorSample.dvb
The CreateCorridorExample subroutine demonstrates the creation of a simple
corridor using the AeccCorridors.Add method. Before calling this subroutine,
be sure the current document contains at least one assembly. A suitable
drawing is the file Corridor-2b.dwg located in the
<installation-directory>\Help\AutoCAD Civil 3D Tutorials\Drawings directory.
The GetCorridorInformationExample subroutine extracts information of all
existing corridors, baselines, feature lines, surfaces, assemblies, and
subassemblies within the current document and displays the data in an
instance of Word. A suitable drawing is the file Corridor-4b.dwg located in the
<installation-directory>\Help\Civil Tutorials\Drawings directory.
NOTE
Microsoft Word must be running before starting this program.
Object Hierarchy
AutoCAD Civil 3D
These images contain the hierarchy of all major objects. This is useful for
determining which class instances are required to create an object of a
particular type, or which objects can be accessed from an existing instance.
www.EngineeringBooksPdf.com
Legend
Graphic Meaning
www.EngineeringBooksPdf.com
Graphic Meaning
Overview
You can create stand-alone applications that use AutoCAD Civil 3D libraries
to perform tasks. Sample programs written in C++, C#, and Visual Basic.NET
are included in the Samples directory.
Samples
All of the following are located in the
<installation-directory>\Sample\Civil 3D API\COM directory.
.\VC++\COM C++\ProjectStats.vcproj
Directly launches AutoCAD Civil 3D and creates a dialog box that displays
some information about the current drawing or adds sample lines into the
alignments of any selected sites.
www.EngineeringBooksPdf.com
Managed C++
.\VC++\Managed C++\C3DManagedExample.vcproj
Using COM interops, launches AutoCAD Civil 3D and creates a dialog box
that displays some information about the current drawing or adds sample
lines into the alignments of any selected sites.
.\VC++\CustomDraw\Sample\C3DCustomDraw.vcproj
Demonstrates accessing the CustomDraw API. This project overrides how
triangles in TIN surfaces are drawn so that they’re numbered. It requires the
Autodesk ObjectARX libraries.
.\VC++\CustomEvent\Sample\C3DCustomEvent.vcproj
Demonstrates using custom events. This project recieves notification just
before and just after a corridor is rebuilt. It requires the Autodesk ObjectARX
libraries.
.\VC++\CustomEvent\Sample\C3DCustomUI.vcproj
Demonstrates UI customization. This project adds a button to the Properties
Property sheet that opens a custom dialog for TIN surfaces. It requires the
Autodesk ObjectARX libraries.
.\VC++\VcClient\VcClientSamp.vcproj
Creates a dialog box that lets you launch AutoCAD Civil 3D and determine
simple information about the current drawing.
C#
.\CSharp\CSharpClient\CSharpClientSample.csproj
Creates a dialog box that lets you launch AutoCAD Civil 3D and determine
simple information about the current drawing.
www.EngineeringBooksPdf.com
Visual Basic .NET
.\VB_NET\VbDotNetClient\VBDotNetClientSample.vbproj
Creates a dialog box that lets you launch AutoCAD Civil 3D and determine
simple information about the current drawing.
www.EngineeringBooksPdf.com
Index
A assemblies applied assemblies 118, 119,
390, 391
AddWallBreaklines() 53 assemblies styles 125, 399
AeccAlignment 65, 286
AeccApplication 205
AeccCorridor 112, 382
B
AeccDatabase 207 baselines 113, 383
AeccDocument 92, 205, 351, 377 baselines applied assemblies 118, 390
AeccParcelSegment 277, 278, 279 baselines baseline regions 114, 385
AeccPipeApplication 92, 351 baselines baseline stations 115, 385
AeccPipeDocument 92, 351 baselines creating 114, 384
AeccPoint 235 baselines feature lines 119, 120, 391,
AeccProfile 79, 299 393
AeccProfileView 85, 303 baselines feature lines offset
AeccRoadwayApplication 377 baselines 121, 394
AeccRoadwayDocument 377 baselines listing 114, 384
AeccSampleLine 309 baselines offset baselines 116, 386
AeccSection 317 breakline, wall 53
AeccSectionView 318 breaklines 259
AeccSite 65, 276, 277, 286 Breaklines 50
AeccSurface 248 breaklines non-destructive 261
AeccSurveyApplication 217 breaklines proximity 260
AeccSurveyDocument 217 breaklines standard 260
AeccSurveyNetworkEntity 227 breaklines wall 261
alignments creating 65, 286
alignments creating from polyline 286
alignments design speeds 71, 291 C
alignments entities 67, 288
alignments offset alignments 65, 286 CivilApplication 22
alignments profiles 79, 299 collections 22, 206
alignments sample lines 309 contours 263
alignments siteless 286 contours extracting 264
alignments station equations 70, 290 control points 222
alignments station sets 70, 290 corridor surfaces cut and fill 397
alignments stations 70, 290 corridors adding stations 115, 385
alignments styles 74, 293 corridors ambient settings 109, 377
alignments superelevation 72, 292 corridors assemblies styles 125, 399
ambient settings 24, 208 corridors base objects 377
ambient settings corridors 109, 377 corridors baselines 113, 114, 383, 384
application object 22, 205 corridors concepts 112, 381
assemblies 117, 387 corridors corridor surfaces 122, 395, 397
407 | Index
www.EngineeringBooksPdf.com
corridors corridor surfaces F
boundaries 123, 396
corridors corridor surfaces masks 123, feature lines 119, 120, 391, 393
396 feature lines offset baselines 121, 394
corridors creating 113, 382
corridors links 119, 391
corridors links styles 126, 400
I
corridors listing 112, 382 interference check 371, 372
corridors points 119, 391 interference check styles 106, 373
corridors roadway style sets 127, 401 IsRightOffset 53
corridors shapes 119, 391
corridors shapes styles 126, 400
custom subassemblies L
package file 189
label styles 27, 211
label styles creating 27, 212
D label styles defining 27, 213
label styles property fields 29, 214
data bands concepts 327
data bands profile views adding to a
view 347 N
data bands profile views creating 345
data bands profile views horizontal non-control points 225
geometry styles 333
data bands profile views profile P
styles 331
data bands profile views styles 342 package file
data bands profile views superelevation custom subassemblies 189
styles 338 package files creating 190
data bands profile views vertical geometry parcel segments 277, 278
styles 336 parcel segments parcel loops 279
data bands section views adding to a parcel segments styles 280
view 348 parcels creating 277
data bands section views creating 346 parcels parcel loops 279
database object 207 parcels parcel segments 277, 278
directions 223 parcels styles 280
document object 205 pipe documents 92, 351
pipe documents ambient settings 92,
351
E pipe documents interference check 371,
entities alignment 67, 68, 288 372
entities profiles 80, 299 pipe documents interference check
entities PVIs 82, 301 styles 106, 373
Event Viewer 207 pipe network creating 96, 356
events adding 207 PipeNetworkCommandsSettings 351
exportTo method 30, 215 pipes creating 98, 357
extended properties 221 pipes dynamic part properties 93, 352
408 | Index
www.EngineeringBooksPdf.com
pipes parts list 94, 354 section views styles axis style 320
pipes styles 100, 359 section views styles axis tick marks 320
pipes using 100, 358 section views styles graph style 321
point groups creating 243 section views styles graph title 321
point groups QueryBuilder 244 sections creating 316
point groups TIN surfaces 245 sections section views 318
point groups using 245 sections using 317
points description keys 242 setups 224
points export to file 236 sharing custom subassemblies 189
points import from file 236 sites creating 276
points point groups 243 station equations 70, 290
points points collection 235 stations 70, 290
points style 239 stations station sets 70, 290
profile views creating 85, 303 structures creating 103, 364
profile views data bands 331 structures dynamic part properties 93,
profile views styles 86, 303 352
profile views styles axis style 87, 304 structures parts list 94, 354
profile views styles axis tick marks 87, structures styles 104, 365
304 structures using 103, 365
profile views styles graph style 88, 305 styles exporting 30, 215
profile views styles graph title 88, 305 subassemblies 117, 387
profiles creating from surface 79, 299 subassemblies attachment 146
profiles creating using entities 80, 299 subassemblies CorridorState 157
profiles PVIs 82, 301 subassemblies example 160
profiles styles 83, 302 subassemblies Help files 152
PVI (points of vertical intersection) 82, subassemblies installing 188
301 subassemblies naming 146
subassemblies parameters 147, 148
subassemblies superelevation 149
S subassemblies support files 157
sample lines 309 subassemblies template program 156
sample lines adding sample lines at a subassemblies tool catalog 174
station 310 subassemblies tool catalog cover
sample lines adding sample lines by page 185
range 310 subassemblies tool catalog creating 175
sample lines adding sample lines from a subassemblies tool catalog data
polyline 310 types 183
sample lines adding sample lines subassemblies tool catalog example 175
setup 310 subassemblies tool catalog registry
sample lines creating 309 file 186
sample lines creating sections 316 superelevation 72, 149, 292
sample lines sample line groups 309, superelevation data bands 338
310, 316 surface analysis elevation analysis 266
sample lines styles 314 surface analysis watershed analysis 267
section views creating 318 SurfaceDefinitionBreaklines 50
section views styles 319 surfaces boundaries 123, 252, 396
Index | 409
www.EngineeringBooksPdf.com
surfaces collection 248 survey figures effect on surfaces 230
surfaces corridor surfaces 122, 395 survey figures prefix database 232
surfaces creating from .tin file 249 survey figures styles 230
surfaces creating from DEM file 250, 256 survey network adding to drawing 227
surfaces creating from LandXML file 249 survey network control points 222
surfaces creating using survey network creating 222
AddGridSurface 250 survey network directions 223
surfaces creating using survey network non-control points 225
AddTinSurface 249 survey network setups 224
surfaces creating volume surfaces 251 survey network traverses 226
surfaces cut and fill 397 survey project creating 220
surfaces elevation analysis 266 survey project settings 221
surfaces extracting contours 264 survey root objects 217
surfaces masks 123, 396 survey user settings 218
surfaces snapshots 256
surfaces styles 265
surfaces TIN surfaces breaklines 259
T
surfaces TIN surfaces contours 263 ThisObject 205
surfaces TIN surfaces point files 258
surfaces TIN surfaces point groups 258
surfaces watershed analysis 267 V
survey ambient settings 218
survey equipment database 219 VBA commands 203
survey figures adding arcs 229
survey figures adding lines 228 W
survey figures adding to drawing 230
survey figures creating 228 WallBreaklineCreation 53
survey figures effect on sites and WallBreaklineCreationEx 53
parcels 230
410 | Index
www.EngineeringBooksPdf.com