Autocad Devblog /autocad/)
Autocad Devblog /autocad/)
com/autocad/page/3/
AutoCAD DevBlog
(https://adndevblog.typepad.com
/autocad/)
11/23/2018
AutoCAD 2019 Migration Steps : NET &
ObjectARX
(https://adndevblog.typepad.com
/autocad/2018/11/autocad-2019-
migration-steps-net-objectarx.html)
By Madhukar Moogala (https://adndevblog.typepad.com/autocad
/Madhukar-Moogala.html)
By now most of the developers might have got chance to peek into
AutoCAD 2019.
1 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
10/11/2018
Pattern generation of linetype with text
on polyline entity
(https://adndevblog.typepad.com
/autocad/2018/10/pattern-generation-
of-linetype-with-text-on-polyline-
entity.html)
By Deepak Nadig (https://adndevblog.typepad.com/autocad
/deepak-nadig.html)
2 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
(https://adndevblog.typepad.com
/.a/6a0167607c2431970b022ad3b7c358200b-pi)
Interactively this can be changed by issuing PEDIT command,
setting Ltype gen as Off.
Command: PEDIT
Enter an option [Open/Join/Width/Edit vertex/Fit/Spline
/Decurve/Ltype gen/Reverse/Undo]: L
Enter polyline linetype generation option [ON/OFF]
<On>: OFF
Via .NET API, Polyline entity has no property to change this. Thanks
to Polyline2d.LinetypeGenerationOn property, we can convert the
Polyline entity to Polyline2d and set this property false. Code sample
shown below with the output image.
3 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
ltr.Name = "COLD_WATER_SUPPLY";
ltr.AsciiDescription =
"Cold water supply ---- CW ---- CW
---- CW ----";
ltr.PatternLength = 0.9;
ltr.NumDashes = 3;
// Dash #1
ltr.SetDashLengthAt(0, 0.5);
// Dash #2
ltr.SetDashLengthAt(1,-0.2);
4 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
ltr.SetShapeStyleAt(1, tt["Standard"]);
ltr.SetShapeNumberAt(1, 0);
ltr.SetShapeScaleAt(1, 0.1);
ltr.SetTextAt(1, "CW");
ltr.SetShapeRotationAt(1, 0);
ltr.SetShapeOffsetAt(1, new Vector2d(0,
-0.05));
// Dash #3
ltr.SetDashLengthAt(2, -0.2);
5 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
acPoly.Closed = true;
btr.AppendEntity(acPoly);
tr.AddNewlyCreatedDBObject(acPoly,
false);
Polyline2d poly2 = acPoly.ConvertTo
(true);
poly2.LinetypeGenerationOn = false;
poly2.LinetypeId = ltId;
tr.AddNewlyCreatedDBObject(poly2, t
rue);
}
tr.Commit();
}
}
Result :
(https://adndevblog.typepad.com
/.a/6a0167607c2431970b022ad37201be200c-pi)
Posted at 04:48 AM in .NET (https://adndevblog.typepad.com/autocad/net/),
AutoCAD (https://adndevblog.typepad.com/autocad/autocad/), Deepak A S Nadig
(https://adndevblog.typepad.com/autocad/deepak-a-s-nadig/) | Permalink
(https://adndevblog.typepad.com/autocad/2018/10/pattern-generation-of-
linetype-with-text-on-polyline-entity.html) | Comments (2)
(https://adndevblog.typepad.com/autocad/2018/10/pattern-generation-of-
linetype-with-text-on-polyline-entity.html#comments)
09/10/2018
6 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
7 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
void testIt() {
ads_name ename;
ads_point pt;
AcDbObjectId objId = AcDbObjectId::kN
ull;
AcDbEntity* pEnt = nullptr;
if (RTNORM != acedEntSel(_T(""), enam
e, pt)) return;
if (!eOkVerify(acdbGetObjectId(objId,
ename))) return;
if (!eOkVerify(acdbOpenAcDbEntity(pEn
t, objId, AcDb::kForRead))) return;
isCenterLineOrNot(pEnt);
Utils
8 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
9 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
AcString strValue;
AcRxProperty * prop = AcRxProperty::c
ast(member);
if (prop != NULL)
{
AcRxValue value;
if ((err = prop->getValue(entit
y, value)) == Acad::eOk)
{
ACHAR * szValue = NULL;
strValue.format(_T("%s =
%s"),
value.type().name(),
(szValue == NULL) ? _T("
none") : szValue);
if (szValue)
delete szValue;
}
else
{
strValue.format(_T("Erro
10 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
AcString str;
str.format(_T("\n%s - %s [%s]"), memb
er->isA()->name(),
member->name(), strValue.k
ACharPtr());
AcString memberName;
memberName.format(_T("%s"), member->n
ame());
if (0 == memberName.collateNoCase(_T
("IsCenterLine")))
{
AcString isTrue(strValue.kAChar
Ptr());
if (isTrue.find(_T("1")) > 0) {
isCenterLine = Adesk::kT
rue;
}
}
acutPrintf(str);
11 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
if (member->children() != NULL)
{
for (int i = 0; i < member->chi
ldren()->length(); i++)
{
const AcRxMember * subMe
mber =
member->children()->at
(i);
printValues(entity, subM
ember, isCenterLine);
}
}
}
Adesk::Boolean isCenterLineOrNot(AcDbEntity*
pEnt)
{
AcRxMemberIterator * iter =
AcRxMemberQueryEngine::theEngine()->n
ewMemberIterator(pEnt);
Adesk::Boolean isCenterLine = Adesk::
kFalse;
for (; !iter->done(); iter->next())
{
printValues(pEnt, iter->current
(), isCenterLine);
}
return isCenterLine;
}
Update:
12 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
enum CenterType
{
CenterMark = 0,
CenterLine
};
AcString SmartCenters[] = { L"CenterMark",
L"CenterLine" };
Acad::ErrorStatus getTypeOfSmartCenterObject
(const AcDbObjectId& blockRefObjId , CenterT
ype& type)
{
AcDbSmartObjectPointer pCenter(block
RefObjId, AcDb::kForRead, true);
if (pCenter.openStatus() != Acad::eO
k)
return Acad::eNullEntityPoin
ter;
AcDbObjectIdArray actionIds;
Acad::ErrorStatus err = AcDbAssocAct
ion::getActionsDependentOnObject(pCenter, fa
lse, true, actionIds);
if (!eOkVerify(err))
return err;
if (objClassName == L"AcDbCe
nterMarkActionBody") {
13 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
type = CenterType::C
enterMark;
return Acad::eOk;
}
else if (objClassName == L"A
cDbCenterLineActionBody") {
type = CenterType::C
enterLine;
return Acad::eOk;
}
else;
}
return Acad::eNotApplicable;
CenterType type;
if (eOkVerify(getTypeOfSmartCenterObject(o
bjId, type)))
{
acutPrintf(_T("CenterType : %s"), SmartCe
nters[type].kACharPtr());
}
14 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
15 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
if (idAct.ObjectClass.Name =
= "AcDbCenterLineActionBody")
{
ed.WriteMessage("\nIt is
CenterLine");
break;
}
}
}
}
catch { };
tr.Commit();
}
08/03/2018
Creating a RealDWG Installer with Wix
Toolset
(https://adndevblog.typepad.com
/autocad/2018/08/creating-a-realdwg-
installer-with-wix-toolset.html)
By Madhukar Moogala (https://adndevblog.typepad.com/autocad
/Madhukar-Moogala.html)
This post contains a video demonstration using Wix toolset to create
RealDWG installer.
Though video targets to RealDWG 2019 using Visual Studio 2017 and
Wix Toolset 3.11, the presentation is suitable for all previous versions
16 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
07/30/2018
Identify Mechanical Desktop file(MDT)
using .NET
(https://adndevblog.typepad.com
/autocad/2018/07/identify-
mechanical-desktop-filemdt-using-
net.html)
By Deepak Nadig (https://adndevblog.typepad.com/autocad
/deepak-nadig.html)
Recently, we had a customer query regarding distinguishing an
17 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
(https://adndevblog.typepad.com
/.a/6a0167607c2431970b022ad3852eb8200d-pi)
18 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
[CommandMethod("testMdtFile")]
public static void testMdtFile()
{
Editor ed = Application.DocumentManager.Mdi
ActiveDocument.Editor;
try
{
using (Database db = new Database(fals
e, true))
{
db.ReadDwgFile(@"c:\temp\testMDT.dw
g", FileOpenMode.OpenForReadAndAllShare, false,
null);
db.CloseInput(true);
string val = GetCustomProperty(db,
"AmdtFileType");
System.Windows.Forms.MessageBox.Sho
w("Value of AmdtFileType is " + val);
}
}
catch (System.Exception ex)
{
ed.WriteMessage(ex.ToString());
}
}
public static string GetCustomProperty(Database
db, string key)
{
DatabaseSummaryInfoBuilder sumInfo = new Da
tabaseSummaryInfoBuilder(db.SummaryInfo);
IDictionary custProps = sumInfo.CustomPrope
rtyTable;
return (string)custProps[key];
}
19 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
05/04/2018
Set origin while creating a hatch using
.NET (https://adndevblog.typepad.com
/autocad/2018/05/set-origin-while-
creating-a-hatch-using-net.html)
By Deepak Nadig (https://adndevblog.typepad.com/autocad
/deepak-nadig.html)
We had an issue raised by a customer regarding setting
origin(image) during hatch creation.
(https://adndevblog.typepad.com
/.a/6a0167607c2431970b0224e03718bd200d-pi)
It was found that origin of hatch has to be set in a transaction other
than the one in which it is created for it to work correctly.
Below code can be used for testing :
20 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
[CommandMethod("setOrginHatch")]
public void setOriginHatch()
{
Document doc = Application.DocumentManager.
MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
ObjectId mHatchId;
Hatch mHatch = new Hatch();
using (Transaction tr1 = db.TransactionMana
ger.StartTransaction())
{
BlockTable bt = (BlockTable)tr1.GetObje
ct(doc.Database.BlockTableId, OpenMode.ForRea
d);
BlockTableRecord btr = (BlockTableRecor
d)tr1.GetObject(db.CurrentSpaceId, OpenMode.For
Write);
ObjectId mPlineId;
mPlineId = btr.AppendEntity(mPolyline);
tr1.AddNewlyCreatedDBObject(mPolyline,
true);
21 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
dCollection();
ObjIds.Add(mPlineId);
btr.AppendEntity(mHatch);
tr1.AddNewlyCreatedDBObject(mHatch, tru
e);
mHatch.Associative = true;
mHatch.AppendLoop(HatchLoopTypes.Outerm
ost, ObjIds);
mHatch.EvaluateHatch(true);
tr1.Commit();
}
//to set the origin use another transaction
using (Transaction tr2 = doc.TransactionMan
ager.StartTransaction())
{
Entity ent = (Entity)tr2.GetObject(mHat
chId, OpenMode.ForWrite);
22 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
if (ent != null)
{
Hatch nHatch = ent as Hatch;
String hatchName = nHatch.PatternNa
me;
Point2d setOrigin = new Point2d(6.6
98, 2.78);
nHatch.Origin = setOrigin;
nHatch.SetHatchPattern(HatchPattern
Type.PreDefined, hatchName);
nHatch.EvaluateHatch(true);
nHatch.Draw();
}
tr2.Commit();
}
}
05/01/2018
Running OEMMAKEWIZARD from
Command Line
(https://adndevblog.typepad.com
/autocad/2018/05/running-
oemmakewizard-from-command-
line.html)
By Madhukar Moogala (https://adndevblog.typepad.com/autocad
/Madhukar-Moogala.html)
23 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
Build Options:
24 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
Path Options
/PA: Specifies the path for AutoCAD OEM loc
ation
/PB: Specifies the path for bitmap location
Import Options
/IC: Specifies a file for enabling\disablin
g AutoCAD commands
/IAS: Specifies a file for adding your comm
ands
/IRS: Specifies a file that allows you to r
emove user specified commands or setvars
Build Options
/BALL Builds all (does not include the file
s executed by /BT command)
/BA Binds ObjectARX/Core ObjectARX applicat
ions
/BB Binds managed applications
/BBA Binds managed ObjectARX applications
/BL Binds AutoLISP applications
/BD Binds DLL modules
/BV Bind DVB macros
/BC Copies files
/BT Builds type libraries and registry file
s
/BT+ Registers associated registry files
/BI Change icons
/BR Rebuilds resources
/BR+ Rebuilds resources and uses settings w
ith AutoCAD OEM
/BR- Rebuilds resources, but does not bind
the DLLs
/STOP Interrupts batch mode when errors are
encountered
/? Displays the Help screen for all command
options
1 @echo off
2 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
3 :::
4 ::: Created by Madhukar Moogala
25 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
26 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
04/26/2018
Viewing LineType Appearance
(https://adndevblog.typepad.com
/autocad/2018/04/viewing-linetype-
appearance.html)
By Madhukar Moogala (https://adndevblog.typepad.com/autocad
/Madhukar-Moogala.html)
I have recieved this query, user would like to get appearance of
LineTypeRecord or LineTypes through API.
Code:
27 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
OpenMode.ForRead);
foreach (ObjectId id in symT
able)
{
var symbol = (LinetypeTa
bleRecord)t.GetObject(id, OpenMode.ForRead);
ed.WriteMessage(string.F
ormat("\nName: {0}\t Appearance: {1}",
symbol.Name, symbol.Comments));
}
t.Commit();
}
}
Output
Name: BYBLOCK Desc:
Name: BYLAYER Desc:
Name: CONTINUOUS Desc: Solid line
Name: Wall Base|CENTER Desc: Center ____ _
____ _ ____ _ ____ _ ____ _ ____
Name: Wall Base|DASHED Desc: Dashed __ __ _
_ __ __ __ __ __ __ __ __ __ __ _
28 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
04/22/2018
Determine the radius and center of
circular cone base using .NET
(https://adndevblog.typepad.com
/autocad/2018/04/determine-the-
radius-and-center-of-circular-cone-
base-using-net-.html)
By Deepak Nadig (https://adndevblog.typepad.com/autocad
/deepak-nadig.html)
(https://adndevblog.typepad.com
/.a/6a0167607c2431970b0224e033ebde200d-pi)
We can make use of Brep support to determine the radius and center
of a cone( properties shown up in the image image) with circular
base.
29 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
[CommandMethod("circularConeRadiusAndCenter")]
public void circularConeRadiusAndCenter()
{
Document doc = Autodesk.AutoCAD.Application
Services.Application.DocumentManager.MdiActiveD
ocument;
Database db = doc.Database;
Editor ed = doc.Editor;
if (per.Status != PromptStatus.OK)
return;
Transaction tr = db.TransactionManager.Star
tTransaction();
using (tr)
{
Solid3d sol = tr.GetObject(per.ObjectI
d, OpenMode.ForRead) as Solid3d;
using (Brep brep = new Brep(sol))
{
//check if base is a circular. If y
es, then determine the center and radius
foreach (Complex cmp in brep.Comple
xes)
{
int edgeCnt = 1;
foreach (Edge edge in brep.Edge
s)
{
ed.WriteMessage("\n --> Edg
e : {0}", edgeCnt++);
30 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
}
}
}
}
}
private string PointToStr(Point3d point)
{
31 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
return "[" +
point.X.ToString("F2") + ", " +
point.Y.ToString("F2") + ", " +
point.Z.ToString("F2")
+ "]";
}
04/17/2018
Forge NextGen webinars!
(https://adndevblog.typepad.com
/autocad/2018/04/forge-nextgen-
webinars.html)
(https://adndevblog.typepad.com
/.a/6a0167607c2431970b01bb0a04e823970d-pi)
Are you ready to learn about the new technologies that will become
available on the Forge platform?
Then you should not miss these webinars :)
32 of 33 5/24/2020, 9:13 PM
AutoCAD DevBlog https://adndevblog.typepad.com/autocad/page/3/
33 of 33 5/24/2020, 9:13 PM