You are on page 1of 20

Lp trnh

AutoCAD
vi C#
Bin son: congnvc@gmail.com
Bn quyn: http://enesy.vn, congnvc@gmail.com

Lp trnh AutoCAD vi C#

Videos v Ebook cp nht nh k hng tun ti cc


a ch sau:
YOUTUBE: https://www.youtube.com/c/EnesyCADteam
WEBSITE: http://enesy.vn [u 2016]
FANPAGE: https://www.facebook.com/hkscd

Hy Subscribe knh Youtube ca EnesyCAD khng b l cc


bi hc lp trnh .NET

http://enesy.vn

Lp trnh AutoCAD vi C#

Gii thiu Ebook


Ebook ny cng vi lot video bi ging c upload trn knh Youtube ca EnesyCAD l b ti
liu hu ch dnh cho cc bn quan tm ti vic nng cao hiu qu s dng AutoCAD bng ngn
ng lp trnh. Ti liu chng ti bin son ch yu hng ti i cc bn c k nng AutoCAD
mc kh v cha c mt cht kin thc no v lp trnh. Nu bn cha c kin thc v ngn
ng lp trnh C# th cng ng qu lo lng, hy c gng theo ht gio trnh ny v bn s thy rng
n khng qu kh. Tuy nhin nu kin thc v AutoCAD ca bn cha tt th l vn , hy
quay li hc AutoCAD trc khi mun lp trnh iu khin n.
Ebook c bin son tng hp da trn mt s ti liu tham kho sau:
1.
2.
3.
4.

C# 5.0 in a nutshell
AutoCAD .NET Developers Guide
VB .NET for AutoCAD 2010
Mt s website cng ng C#, AutoCAD .NET: codeproject.com, codeplex.com,
githup.com, through-the-interface.com

Mi kin ng gp khen ch xin gi mail: congnvc@gmail.com hoc congnv@enesy.vn. Chn


thnh cm n cc bn s dng ebook, hi vng ebook ny hu ch vi cc bn.

http://enesy.vn

Lp trnh AutoCAD vi C#

Chng m u

http://enesy.vn

Lp trnh AutoCAD vi C#
Sn phm
Ngn ng lp trnh
Giao din lp trnh ng dng1

AutoCAD
C#
.NET API2

Ebook ny s t hiu qu cao nht khi s dng km vi cc video trn knh Youtube ca
EnesyCAD

Ti sao li l C#?
La chn ngn ng lp trnh m rng AutoCAD lun l vn kh kh khn i vi ngi mi
bt u. Vic so snh ngn ng lp trnh no l mnh v ph hp phn ln do ch quan ca mi
ngi, kh m tha lng tt c mi ngi c. Vi ti, ch c 2 nhm ngn ng lp trnh lm ti
quan tm:
1. Nhm cc ngn ng lp trnh khng h tr to CUSTOM OBJECT trong AutoCAD
2. Nhm cn li
Nhm th nht bao gm cc ngn ng: AutoLISP, VBA, VB.NET, C#, Trong khi nhm th 2 ch c
C++.
Nu bn c th lp trnh to ra mt i tng chng hn nh Ci bn, bao gm cc c tnh
nh: S chn, mu sc, loi g, bng ch mt lnh tng t nh khi bn thc hin lnh Line
to ra on thng th Ci bn c gi l CUSTOM OBJECT. Ch khi lp trnh bng C++ vi Object
ARX API bn mi c th to ra c i tng Ci bn nh trn. Bn hy th tr li vi cu hi sau:

Ti mun to ra mt sn phm ln, quy m tng t nh cc phn mm trn nn


AutoCAD: Land Desktop, Architech, Civil3D ???
Ti c nh hng chuyn t k s cng trnh sang k s phn mm?

Nu cc cu tr li l khng th bn nn cn nhc vic hc Object ARX, khng phi ti c da


bn nhng thc t l Object ARX rt kh xi, v th hy sau i, quay tr li thc tin l bn vn
cha bit mt t g v ngn ng lp trnh. Chng ta tip tc!
Bn s phi la chn cc ngn ng trong nhm 1, tt nhin ri!
AutoLISP l ngn ng lp trnh dng kch bn, rt thch hp cho lp trnh m rng AutoCAD, ch c
vi im AutoLISP m ti khng thch, th nht: Cu trc ca n khng c d nhn lm, th 2:
Vic to giao din ngi dng trong AutoLISP qu l mt cc hnh.
VBA: v c bn l VB (Visual Basic) c thu gn, hay ni cch khc l b i mt s tnh nng,
phi ni tht rng bn thn VB khi cha thu gn cng khng c ngon lnh ri, gi Microsoft
li cn nhn tm rt gn n i na nhng vo cc phn mm ca hng khc th

1
Giao din lp trnh ng dng cung cp cho ngi lp trnh cc hm tng tc vi C S D Liu, lp trnh
thc hin cc thao tc vi h iu hnh hay phn mm . Hu ht cc hm API c cha trong cc file
DLL
2
Ni mt cch n gin th NET l mt giao din ng gia (ging nh mt thng dich vin) cho 2
components vit bng 2 ngn ng khc nhau c th hiu nhau.

http://enesy.vn

Lp trnh AutoCAD vi C#
Tng t AutoLISP, to giao din ngi dng trong VBA cng khng phi d dng. Tuy nhin so
vi AutoLISP th VBA vn trn 1 bc.
Khng th ph nhn AutoLISP v VBA c mt u im rt r rng l t b hn ch v vic tng
thch phin bn, chng hn nu bn lp trnh 1 on m bng AutoLISP v VBA th rt c th n s
chy c trn hu ht phin bn AutoCAD. Cng cn ni thm l AutoDesk bt u tch ri
VBA khi cc sn phm ca mnh k t nm 2010, c th trong tng lai s khng h tr VBA na.
VB .NET: hi kh so snh gia VB .NET v C# v hu nh ci g C# c th VB.NET cng c, tuy
nhin ti vn loi VB.Net v cc l do sau:
1. Cu trc ca VB .NET rt rm r
2. Cng ng VB .NET khng ln lm (so vi cng ng C#)
C th so snh cu trc ca VB .NET v C# qua v d sau:
V d 1: Khai bo v khi to mt th hin ca lp Circle trong AutoCAD
VB.NET
Dim acCirc As Circle = New Circle()

C#
Circle acCirc = new Circle();

V d 2: Vng lp
VB.NET
If acSSPrompt.Status = PromptStatus.OK Then
acSSet = acSSPrompt.Value
Application.ShowAlertDialog("S lng i tng chn: " & _
acSSet.Count.ToString())
Else
Application.ShowAlertDialog("S lng i tng chn: 0")
End If

C#
if (acSSPrompt.Status == PromptStatus.OK)
{
acSSet = acSSPrompt.Value;
Application.ShowAlertDialog("S lng i tng chn: " +
acSSet.Count.ToString());
}
else
{
Application.ShowAlertDialog("S lng i tng chn: 0");
}

Da vo 2 v d trn cc bn c th thy rng cu trc ca C# gn gng hn VB .NET rt nhiu,


iu ny cng khng quan trng bng l do th 2 m ti ni trn, i vi bt c mt ngn ng lp
trnh no th cng ng c vai tr rt ln, s h tr ca mt cng ng ln lun l iu m cc lp
trnh vin mong i. VB .NET v C# c mt li th l tn dng c cc th vin ca .NET
Framework, l th vin rt hu ch cho cng vic lp trnh.

http://enesy.vn

Lp trnh AutoCAD vi C#

Tng quan v AutoCAD .NET API


AutoCAD .NET API l mt giao din lp trnh, nm na l mt ci g m nh n, bn c th tng
tc vi AutoCAD c.
AutoCAD .NET API thc s rt tuyt. S d ti c th ni nh vy v ch cn mt dng lnh c vit
bng AutoCAD .NET API cng lm vng (crash) AutoCAD. C th bn cha tin nhng khi bt
tay vo vit code AutoCAD .NET, ch cn bn qun ng (commit) Transaction th lp tc AutoCAD
s b Crash.
Mt th no c sc mnh lm vng AutoCAD ch trong mt dng lnh th chc hn n cng
sc lm nhng iu tuyt vi khc?!.
Bn c tin nh vy khng?
Mnh hn VBA? ng!
Nhanh hn VBA? ng!
D hn VBA? , c th, nu chng ta thc s hiu c cu trc ca .NET API.

Nu chng ta thc s hiu cu trc ca .NET API?


Trc khi bt tay vo vit code, bin dch, chy cc lnh mi, chng ta cn phi nm vng mt s
kin thc c s ca AutoCAD .NET API. Sau y chng ta s quan st hai thnh phn khc nhau ca
AutoCAD .NET API. u tin l khng gian tn (namespace) ca AutoDesk. Khng gian tn l ni
m cc i tng (Objects) c t chc nh th no (tm thi chng ta c hiu n tng nh
mt a ch nh, gm s nh ng ngch - tn ng ). Tip theo chng ta s xem xt k hn
v C s d liu bn v ca AutoCAD, bit c cc thnh phn c trong mt bn v AutoCAD.
Hiu c C s d liu ca bn v .DWG l nn tng vng chc chng ta tin ti cc bc tip
theo.

http://enesy.vn

Lp trnh AutoCAD vi C#
AutoDesk
AutoCAD
ApplicationServices
Application
Colors
ComponentModel
DatabaseServices
Filters
EditorInput
Geometry
GraphicInterface
GraphicSystem
Internal
Calculator
DatabaseServices
Forms
PreviousInput
PropertyInspector
Reactors
Windows
LayerManager
Plotting Services
Publishing
Runtime
Windows
Data
ToolPalette

AutoCAD .NET API c t chc di


dng cy nh hnh bn. V d nu chng
ta cn hi ngi dng nhp d liu
(input) (chn mt im, chn mt i
tng chng hn), iu ny c thc
hin trong cc lp ca namespace
EditorInput, ng dn y n
namespace ny l:
AutoDesk. AutoCAD. EditorInput
Nu chng ta mun lm vic vi cc i
tng c v trong khng gian Model
(ModelSpace) th chng ta phi dng
khng gian tn
AutoDesk. AutoCAD.DatabaseServices
Tt c i tng hnh hc c t chc
trong khng gian tn AutoDesk.
AutoCAD.Geometry. Chng hn nh khi
chng ta mun nh ngha mt i
tng Line, chng ta s to cc c tnh
l StartPoint v EndPoint cho n, cc
im ny l i tng Point3d trong
khng gian tn Geometry.
Nu chng ta mun to ra mt lnh mi
trong AutoCAD chng ta s phi s dng
CommandMethod ca khng gian tn
AutoDesk. AutoCAD. Runtime

Quan st on m sau (cc bn cha cn quan tm n ngha ca tng cu lnh):


[CommandMethod("DrawALine")]
public void DrawALine()
{
Point3d startPoint = new Point3d(0, 0, 0);
Point3d endPoint = new Point3d(4, 5, 6);
Line line = new Line(startPoint, endPoint);
[...]
}

Nh chng ta thy y, mt lnh mi c tn l DrawALine c to ta trong on m trn.


Hai i tng Point3d c to ra vi ta ln lt l (0, 0, 0) v (4, 5, 6) v c t tn l:
startPoint v endPoint. Cc i tng Point3d ny sau s c dng to ra i tng
Line.

Ch rng i tng Point3d l mt phn ca namespace Geometry v i tng Line l mt


phn ca namespace DatabaseServices. iu ny c ngha l Line c th c thm vo bn v
AutoCAD m Point3d l khng th, bi v n ch l mt i tng hnh hc (Geometry) m
khng phi l i tng C s d liu (Database). Mc ch ca cc i tng hnh hc l tham gia
cu thnh nn mt i tng C s d liu (chng hn Line).
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

http://enesy.vn

Lp trnh AutoCAD vi C#
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
namespace Enesy.CAD
{
public partial class Commands
{
[CommandMethod("DrawALine")]
public void DrawALine()
{
Point3d startPoint = new Point3d(0, 0, 0);
Point3d endPoint = new Point3d(4, 5, 6);
Line line = new Line(startPoint, endPoint);
}
}
}

n y, chng ta vn cha cn quan tm n ngha ca tng cu lnh trong on m trn. on


m ny ch nhm mc ch lm sng t ngha ca namespace trong .NET (cng nh trong
AutoCAD). Nh ti cp trang trc, CommandMethod thuc namespace
Autodesk.AutoCAD.Runtime, v th chng ta c th vit:
[Autodesk.AutoCAD.Runtime.CommandMethod("DrawALine")]

thay cho
[CommandMethod("DrawALine")]

V b qua cu lnh:
using Autodesk.AutoCAD.Runtime;

Cu lnh ny l cu lnh nhp khng gian tn, ngha ca cu lnh ny l bn s khng phi nhp
y ng dn n khng gian tn ca mt lp CommandMethod, v chng ta nhp khng
gian tn ny u m ngun bng cu lnh:
using Autodesk.AutoCAD.Runtime;

Bn thm v Khng gian tn (namespace)


Khng gian tn l ng dn tr n tn kiu (class), ni m chng thng c t chc di
dng cy, iu ny lm cho vic tm kim kiu tr nn d dng hn. Xt v d sau:
namespace Outer.Middle.Inner
{
class Class1 { }
class Class2 { }
}

on code trn cho thy trong khng gian tn Outer.Middle.Inner c 02 lp l: Class1 v Class2.
on m ny cng c th c vit theo cch khc:
namespace Outer
{
namespace Middle

http://enesy.vn

Lp trnh AutoCAD vi C#
{
namespace Inner
{
class Class1 { }
class Class2 { }
}
}
}

Cch vit u tin s dng du chm (.) trong khi cch vit th 2 s dng php lng khng gian
tn (nested). Trong thc t cch vit th nht c s dng ph bin hn.
Vic s dng khng gian tn khng nhng gip vic tm kim d dng m cn trnh c cc xung
t, chng hn nh bn c th to ra 2 lp c tn l Class1, c t chc trong cc namespace
khc nhau nh sau:
namespace Namespace1
{
class Class1 { }
}
namespace Namespace2
{
class Class1 { }
}

V khi thc hin gi:


Namespace1.Class1 ..
Namespace2.Class1 ..

Cu trc C s d liu bn v AutoCAD


Tip theo chng ta s tm hiu xem mi bn v (.DWG) AutoCAD s bao gm nhng thnh phn
g.
Mi bn v AutoCAD c lu tr trong my tnh di dng 1 file vi phn m rng l .DWG. Nu
chng ta tin hnh m x file DWG ra, ta s c hai thnh phn l: Document (Ti liu) v
Database (C s d liu). Phn Document bao gm cc thuc tnh (Properties)3 chng hn nh
cc bin lu tr thuc tnh ca Dimension (vd: text height, dimscale, ) trong khi Database
bao gm Tables (Cc Bng) v Records (Cc Bn ghi). Bng bao gm mt hoc nhiu bn ghi.
Hnh v sau y m t cu trc ca file bn v DWG.

Khng cn cch no khc, k t y bn s bt u phi lm quen vi cc thut ng ting Anh, hi kh xi


nhng s l bt buc cho cng vic lp trnh

http://enesy.vn

Lp trnh AutoCAD vi C#

Bn v AutoCAD .dwg

Document
Cc c tnh (Properties) v phng thc (methods)

Database
Tables
Design spaces

Records
ModelSpace
Layout1 (PaperSpace)
Layout2 (PaperSpace)
SlidingDoor (Block Definition)
Horizontal Dimensions
Vertical Dimensions
Aligned Dimensions

Layers
Linetypes
TextStyles
DimStyles
Cc khi nim tip theo y kh kh nn bn cn phi dnh thi gian suy ngh tm ra logic quan
h ca chng, nh vy bn s nm bt c vn v kh qun.
BlockTable bao gm cc BlockTableRecords. ModelSpace l mt BlockTableRecord, tng t
PaperSpace cng l mt BlockTableRecord. Nu chng ta mun v mt i tng vo
ModelSpace ca bn v AutoCAD, chng ta s thm n vo BlockTableRecord c tn l
ModelSpace

http://enesy.vn

10

Lp trnh AutoCAD vi C#

Bn v AutoCAD .dwg

Document
Cc c tnh (Properties) v phng thc (methods)

Database
Tables

Records

BlockTable

BlockTableRecord, BlockTableRecord

LayerTable

LayerTableRecord, LayerTableRecord

LineTypeTable
LineTypeTableRecord,

LineTypeTableRecord,

TextStyleTable
TextStyleTableRecord,

TextStyleTable Record,

DimStyleTable
DimStyleTableRecord,

DimStyleTable Record,

Bng LayerTable bao gm cc bn ghi LayerTableRecord. Tt c cc bn v u bao gm mt


layer mc nh l Layer 0, Layer 0 l mt LayerTableRecord ca LayerTable. Nu chng ta mun
to ra mt Layer khc, chng ta s to ra mt LayerTableRecord v thm n vo trong
LayerTable ca C s d liu bn v .dwg.
Va ri l cc khi nim mi v kh kh, nu cha thc s hiu v n, hy nh du li, sau ny
chng ta s cn quay li cc vn ny rt nhiu. Nu bn cm thy au u v cc khi nim ny
th b qua n i, cha cn phi nm bt vi.
Hy tng tng rng bn mun v mt on thng trong ModelSpace. Chng ta bit rng
ModelSpace l mt BlockTableRecord trong BlockTable. V th, quy tc chung l chng ta s bt
u t ci tng th n ci chi tit. u tin chng ta s ly ra BlockTable, k n l ly ra
BlockTableRecord (trong trng hp ny l ModelSpace), v thm i tng Line vo
ModelSpaceRecord. Hy tng tng nh bn ang m cnh ca ca mt ngi nh, tip theo bn
tm n ci t, m ca t v t vo mt vt ri ng ca t li.
Nu bn mun thm mt Layer vo bn v, u tin phi ly ra LayerTable, tip theo l to ra mt
LayerTableRecord c tn l bt k v thm n vo LayerTable.
Trong AutoCAD .NET API, chng ta ly ra mt th bng cch M (Open) n ra c (Read) hoc
Ghi (Write).

http://enesy.vn

11

Lp trnh AutoCAD vi C#
Hy tng tng rng bn mun v mt on thng trong ModelSpace. Chng ta bit rng
ModelSpace l mt BlockTableRecord trong BlockTable. V th, chng ta s m BlockTable for
Read ( c) u tin, sau l m BlockTableRecord l ModelSpace for Write ( ghi). on
ny nghe c v hi di dng nhng thc ra l mc ch ca chng ta m ra lm g th s gn
thm mode cho n tng ng l for Read hoc for Write thi.
Vn t ra l ti sao AutoDesk li phn chia ra for Read v for Write lm g? Bn hon ton
c th m mt Database Object hoc Entity di dng for Write bt c lc no, bi v nu n c
m di dng for Write th ng nhin n s for Read c.

Bn thm v OpenMode
AutoCAD .NET API c ba kiu m mt Database Object hoc Entity l: OpenMode.ForRead,
OpenMode.ForWrite v OpenMode.ForNotify.
R rng l bn s phi m mt i tng di dng ForWrite khi cn thit phi thay i hoc thm
mt th g vo, iu ny l khng phi bn ci na. Nu m di dng ForWrite cho mt i
tng Database hoc Entity ch c th s lm tng thi gian thc thi ca code. on m sau
y s lm sng t vn ny (bn khng cn phi quan tm ngha ca tng cu lnh, hy c 1
ln v nm s qua cu trc ca n, sau ny khi nm bt c cc kin thc c bn, hy c li
n v bn s hiu hn ln c th nht, c nh vy. Cn hin gi th ti ch mun so snh thi
gian thc thi ca 2 kiu m i tng l ForeRead v ForWrite thi).
/// <summary>
/// Phng thc ly i tng Circle cui cng c v vo bn v
/// </summary>
/// <returns>ObjectId</returns>
public static ObjectId GetLastCircle1()
{
ObjectId cirId = ObjectId.Null;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
as BlockTable;
BlockTableRecord btr =
tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as
BlockTableRecord;
foreach (ObjectId id in btr)
{
DBObject obj = tr.GetObject(id, OpenMode.ForRead);
if (obj is Circle)
cirId = obj.ObjectId;
}
tr.Commit();
}
return cirId;
}
/// <summary>
/// Phng thc ly i tng Circle cui cng c v vo bn v
/// </summary>
/// <returns>ObjectId</returns>
public static ObjectId GetLastCircle2()
{

http://enesy.vn

12

Lp trnh AutoCAD vi C#
ObjectId cirId = ObjectId.Null;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId,
OpenMode.ForWrite) as BlockTable;
BlockTableRecord btr =
tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as
BlockTableRecord;
foreach (ObjectId id in btr)
{
DBObject obj = tr.GetObject(id, OpenMode.ForWrite);
if (obj is Circle)
cirId = obj.ObjectId;
}
tr.Commit();
}
return cirId;
}
/// <summary>
/// Kim tra thi gian M i tng ForRead
/// </summary>
[CommandMethod("OpenReadForRead")]
public static void OpenReadForRead_Method()
{
Editor ed =
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocum
ent.Editor;
DateTime begin = DateTime.Now;
GetLastCircle1();
TimeSpan elapsed = DateTime.Now.Subtract(begin);
ed.WriteMessage("Tng thi gian OpenReadForRead: {0}\n",
elapsed.TotalMilliseconds);
}
/// <summary>
/// Kim tra thi gian M i tng ForWrite
/// </summary>
[CommandMethod("OpenWriteForRead")]
public static void OpenWriteForRead_Method()
{
Editor ed =
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocum
ent.Editor;
DateTime begin = DateTime.Now;
GetLastCircle2();
TimeSpan elapsed = DateTime.Now.Subtract(begin);
ed.WriteMessage("Tng thi gian OpenWriteForRead: {0}\n",
elapsed.TotalMilliseconds);
}

Bin dch, thc thi on m trn trong AutoCAD ti thu c kt qu nh sau:


Command: CreateCircles1
Command: CreateCircles2
Command: OpenReadForRead
Tng thi gian OpenReadForRead: 374.4006
Command: OpenWriteForWrite
Tng thi gian OpenWriteForWrite: 889.2016

http://enesy.vn

13

Lp trnh AutoCAD vi C#
Nh vy, thi gian m ForWrite gp 2.4 ln thi gian m ForRead. Vi mt tc v ln trong lp
trnh con s ny s nh hng rt nhiu n thi gian x l.
Quy tc rt ra l: Hy lun m di dng ForRead tr khi bn mun chnh sa, thay i n.
Quay tr li, hy tng tng rng bn mun v mt i tng Line vo ModelSpace. Chng ta
u bit rng ModelSpace l mt BlockTableRecord trong BlockTable. V th, hy m BlockTable
for Read trc (tt nhin, v chng ta cha c chnh sa g n c), tip theo chng ta s m mt
BlockTableRecord l ModelSpace di dng for Write. Ti sao? V chng ta s thm i tng Line
ny vo ModelSpace, iu ny c ngha l chng ta thay i n, do phi m n ra di dng
for Write th mi thay i n c.
Trong AutoCAD .NET API, chng ta ly ra mt th bng cch M (Open) n ra c (Read) hoc
Ghi (Write) trong mt Transaction (giao dch).
Khi nim tip theo l Transaction, y l mt khi nim rt quan trng trong lp trnh AutoCAD
.NET, ngha ca n l Giao dch v nhim v ca n ng vi ngha en l Giao dch.
Li quay tr li vi v d trc, hy tng tng rng chng ta mun v mt i tng Line vo
trong ModelSpace. Chng ta u bit rng ModelSpace l mt BlockTableRecord trong
BlockTable (ti nhc li cu ny kh nhiu ln, hi vng l bn ghi nh n trong u). Bt c
lc no khi chng ta mun c hoc ghi c s d liu ca bn v dwg, chng ta u thc hin di
dng mt giao dch (Transaction), tng t nh giao dch rt tin hoc np tin vo ti khon vy.
Trc khi c hoc ghi chng ta u phi bt u mt Transaction, y l nguyn tc bt di bt
dch trong lp trnh AutoCAD .NET. Sau khi kt thc mi th chng ta phi ng Transaction, nu
chng ta mun cc thay i ny c hiu lc trong C s d liu ca bn v. V vy trnh t thc
hin s c sa li nh sau:
u tin chng ta s bt u mt Transaction, m BlockTable for Read trc tin, tip n chng
ta s m BlockTableRecord l ModelSpace for Write, tip n chng ta s thm i tng Line
vo ModelSpace, thng bo vi Transaction rng chng ta thm i tng Line ny, ng
Transaction. Bn phi nh k nguyn tc ny, ch cn th thi, sau ny khi vit code c chiu theo
nguyn tc ny m trin khai l c.
Trong AutoCAD .NET API, chng ta ly ra mt th bng cch M (Open) n ra c (Read) hoc
Ghi (Write) trong mt Transaction thng qua ObjectID ca i tng m chng ta mun m.
ObjectID l khi nim cui cng m chng ta cn phi nm trc khi i vo cc v d thc t.
Tt c mi i tng Database u c ObjectID, ging nh l s Chng minh th vy. BlockTable
c mt ObjectID, ModelSpace c mt ObjectID, Lines, Circles, Arcs c v vo ModelSpace u
c ObjectID.
Tp hp c s d liu cu thnh nn bn v AutoCAD l Tp hp cc ObjectIDs.
ObjectID ca cc i tng c truy cp thng qua thuc tnh ID ca i tng .
Chng ta truy cp vo cc Bng (Tables ch ng nhm ln vi i tng Table trong bn v
AutoCAD) trong C s d liu bn v AutoCAD bng cch dng ID tng ng ca Database . V
d, nu chng ta mun m BlockTable ca mt Database, chng ta s ly BlockTable bng cch

http://enesy.vn

14

Lp trnh AutoCAD vi C#
m n thng qua thuc tnh BlockTableID ca Database. l LayerTableID, TextStyleTableID v
LineStyleTableID.
No, by gi l lc chng ta tng hp li nhng g ni trn, thng qua mt v d hon chnh
(ch bn ng quan tm n ngha ca tng cu lnh vi, hy ch xem qua thi):
[CommandMethod("DrawALine")]
public void DrawALine()
{
Point3d startPoint = new Point3d(0, 0, 0);
Point3d endPoint = new Point3d(4, 5, 6);
Line line = new Line(startPoint, endPoint);
Database acDb = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction tr = acDb.TransactionManager.StartTransaction())
{
// M BlockTable for Read
BlockTable blk = acDb.BlockTableId.GetObject(OpenMode.ForRead) as
BlockTable;
// M BlockTableRecord for Write
BlockTableRecord blkrcrd =
blk[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
// Thm i tng Line vo ModelSpace BlockTableRecord
blkrcrd.AppendEntity(line);
// Thm i tng Line vo Transaction
tr.AddNewlyCreatedDBObject(line, true);
// ng Transaction
tr.Commit();
}
}

Hi vng n y bn nm c s qua v AutoCAD .NET API. Bn sn sng cha? Chng ta


bt u khm ph cch thc iu khin AutoCAD.

http://enesy.vn

15

Lp trnh AutoCAD vi C#

Ci t cc phn mm cn thit
lp trnh AutoCAD .NET, bn s phi ci t cc phn mm sau:

AutoCAD (ng nhin)


Visual Studio 2008 tr ln (c th chn Visual 2012 Ultimate)

Cch thc ci t AutoCAD v Visual Studio cc bn c th tm trn mng c rt nhiu.

To Plugin u tin
Sau khi ci thnh cng cc phn mm cn thit trn, chng ta s tin hnh to ra plugin u
tin. Ch : u ti gi thit rng bn s dng Visual Studio 2012 v lp trnh ng dng cho
AutoCAD2007, vi cc phin bn khc, cc bn xem chi tit video trn knh Youtube r hn.

Bc 1
Khi ng Visual Studio 2012, chn New > Project, xut hin hp thoi New Project

Pha trn cng, la chn .NET Framework 2.0 cho phin bn AutoCAD 2007, vi cc phin bn cn
li chn theo danh sch sau:

khung bn tri, chn Templates l Visual C#, khung Templates gia chn Class Library, cc
thng tin di cng bn t ty . Bm OK tip tc.
Visual studio s to ra mt Project trng vi mt file m ngun C# mu l Class1.cs. Tip theo
chng ta s tham kho n cc th vin .NET ca AutoCAD
http://enesy.vn

16

Lp trnh AutoCAD vi C#

Bc 2
Nhp chut phi vo References > chn Add Reference
Hp thoi Reference Manager xut hin.

Bm chn Browse

Hp thoi Select Files to References xut hin, duyt n th mc ci AutoCAD v chn 2 file l:

Acmgd.dll
Acdbmgd.dll

Bm Add

Bc 3
Copy on m sau Paste vo Class1.cs
using
using
using
using

System;
Autodesk.AutoCAD.Runtime;
Autodesk.AutoCAD.ApplicationServices;
Autodesk.AutoCAD.EditorInput;

namespace FirstExample

http://enesy.vn

17

Lp trnh AutoCAD vi C#
{
public class Class1
{
[CommandMethod("hello")]
public void HelloWorld()
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Editor acEd = acDoc.Editor;
acEd.WriteMessage("\nWellcome to EnesyCAD!");
}
}
}

Bc 4 - Bin dch m ngun


Tin hnh bin dch m ngun bng cch nhn chut phi
vo Project ( y ti t tn Project l FirstExample), > chn
Build (Hoc nhn F6)
M th mc lu gi Project ca bn ra bng cch nhp chu
phi vo Project > Open Folder in Explorer, tip theo truy
cp vo th mc bin > Debug
Bn s nhn thy ngoi 2 file acmgd.dll v acdbmgd.dll ra cn
c 1 file .dll l sn phm bin dch ca trnh bin dch C# to
ra t m ngun Project ca bn. y chnh l thnh qu ca
chng m u.

Bc 5 Load v s dng lnh va to ra


Khi ng AutoCAD, g lnh Netload v tm n th mc trn, load file .dll va to ra bng cch
duyt v m n.
Quay li AutoCAD, g lnh HELLO, kt qu:
Command: hello
Wellcome to EnesyCAD!
n y ti kt thc chng ny, hi vng qua chng ny bn c mt ci nhn kh tng qut v
lp trnh AutoCAD .NET. Trong chng tip theo chng ta s i su tm hiu v ngn ng lp trnh
C#.
ng qun Subscribe knh EnesyCAD khng b l cc bi ging mi nht v lp trnh C# trong
AutoCAD nh!
https://www.youtube.com/c/EnesyCADteam

http://enesy.vn

18

Lp trnh AutoCAD vi C#

http://enesy.vn

19

You might also like