- UID
- 658062
- 积分
- 2147
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2008-10-22
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
http://www.cppblog.com/mzty/archive/2006/06/26/9021.html
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.Colors;
- using Autodesk.AutoCAD.EditorInput;
- [assembly: CommandClass(typeof(ClassLibrary.Class))]
- namespace ClassLibrary
- {
- /// <summary>
- /// Summary description for Class.
- /// </summary>
- public class Class
- {
- public Class()
- {
- //
- // TODO: Add constructor logic here
- //
- }
- // This function returns the ObjectId for the BlockTableRecord called "EmployeeBlock",
- // creating it if necessary. The block contains three entities - circle, text
- // and ellipse.
- public ObjectId CreateEmployeeDefinition()
- {
- ObjectId newBtrId = new ObjectId(); // The return value for this function
- Database db = HostApplicationServices.WorkingDatabase; // save some space
- Transaction trans = db.TransactionManager.StartTransaction(); // begin the transaction
- Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
- try
- {
- // Now, drill into the database and obtain a reference to the BlockTable
- BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
- if ((bt.Has(" EmployeeBlock ")))
- {
- newBtrId = bt[" EmployeeBlock "];
- }
- else
- {
- Point3d center = new Point3d(10, 10, 0); // convenient declaration
- // Declare and define the entities we want to add:
- // Circle:
- Circle circle = new Circle(center, Vector3d.ZAxis, 2);
- // Text:
- // MText text = new MText();
- // text.Contents = "Earnest Shackleton";
- // text.Location = center;
- // Attribute Definition
- AttributeDefinition text = new AttributeDefinition(center, " NoName ", " Name: ", " Enter Name ", db.Textstyle);
- text.ColorIndex = 2;
- // Ellipse:
- Ellipse ellipse = new Ellipse(center, Vector3d.ZAxis, new Vector3d(3, 0, 0), 0.5, 0, 0);
- // Next, create a layer with the helper function, and assign
- // the layer to our entities.
- ObjectId empId = CreateLayer();
- text.LayerId = empId;
- circle.LayerId = empId;
- ellipse.LayerId = empId;
- // Set the color for each entity irrespective of the layer's color.
- text.ColorIndex = 2;
- circle.ColorIndex = 1;
- ellipse.ColorIndex = 3;
- // Create a new block definition called EmployeeBlock
- BlockTableRecord newBtr = new BlockTableRecord();
- newBtr.Name = " EmployeeBlock ";
- newBtrId = bt.Add(newBtr); // Add the block, and set the id as the return value of our function
- trans.AddNewlyCreatedDBObject(newBtr, true); // Let the transaction know about any object/entity you add to the database!
- newBtr.AppendEntity(circle); // Append our entities
- newBtr.AppendEntity(text);
- newBtr.AppendEntity(ellipse);
- trans.AddNewlyCreatedDBObject(circle, true); // Again, let the transaction know about our newly added entities.
- trans.AddNewlyCreatedDBObject(text, true);
- trans.AddNewlyCreatedDBObject(ellipse, true);
- }
- trans.Commit(); // All done, no errors? Go ahead and commit!
- }
- catch
- {
- ed.WriteMessage(" Error Creating Employee Block ");
- }
- finally
- {
- trans.Dispose();
- }
- // CreateDivision(); // Create the Employee Division dictionaries.
- return newBtrId;
- }
- // This function creates a new BlockReference to the "EmployeeBlock" object,
- // and adds it to ModelSpace.
- public ObjectId CreateEmployee(string name, string division, double salary, Point3d pos)
- {
- Database db = HostApplicationServices.WorkingDatabase;
- Transaction trans = db.TransactionManager.StartTransaction();
- try
- {
- BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForWrite));
- BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
- // Create the block referenceuse the return from CreateEmployeeDefinition directly!
- BlockReference br = new BlockReference(pos, CreateEmployeeDefinition());
- // btr.AppendEntity(br); // Add the reference to ModelSpace
- // trans.AddNewlyCreatedDBObject(br, true); // Let the transaction know about it
- AttributeReference attRef = new AttributeReference();
- // Iterate the employee block and find the attribute definition
- BlockTableRecord empBtr = (BlockTableRecord)trans.GetObject(bt[" EmployeeBlock "], OpenMode.ForRead);
- foreach (ObjectId id in empBtr)
- {
- Entity ent = (Entity)trans.GetObject(id, OpenMode.ForRead, false);
- // Use it to open the current object!
- if (ent is AttributeDefinition) // We use .NET's RTTI to establish type.
- {
- // Set the properties from the attribute definition on our attribute reference
- AttributeDefinition attDef = ((AttributeDefinition)(ent));
- attRef.SetPropertiesFrom(attDef);
- attRef.Position = new Point3d(attDef.Position.X + br.Position.X, attDef.Position.Y + br.Position.Y, attDef.Position.Z + br.Position.Z);
- attRef.Height = attDef.Height;
- attRef.Rotation = attDef.Rotation;
- attRef.Tag = attDef.Tag;
- attRef.TextString = name;
- }
- }
- // Add the reference to ModelSpace
- btr.AppendEntity(br);
- // Add the attribute reference to the block reference
- br.AttributeCollection.AppendAttribute(attRef);
- // let the transaction know
- trans.AddNewlyCreatedDBObject(attRef, true);
- trans.AddNewlyCreatedDBObject(br, true);
- // Create the custom per-employee data
- Xrecord xRec = new Xrecord();
- // We want to add 'Name', 'Salary' and 'Division' information. Here is how:
- xRec.Data = new ResultBuffer(
- new TypedValue((int)DxfCode.Text, name),
- new TypedValue((int)DxfCode.Real, salary),
- new TypedValue((int)DxfCode.Text, division));
- // Next, we need to add this data to the 'Extension Dictionary' of the employee.
- br.CreateExtensionDictionary();
- DBDictionary brExtDict = (DBDictionary)trans.GetObject(br.ExtensionDictionary, OpenMode.ForWrite, false);
- brExtDict.SetAt(" EmployeeData ", xRec); // Set our XRecord in the dictionary at 'EmployeeData'.
- trans.AddNewlyCreatedDBObject(xRec, true);
- trans.Commit();
- return br.ObjectId;
- }
- finally
- {
- trans.Dispose();
- }
- }
- // This function returns the objectId for the "EmployeeLayer", creating it if necessary.
- public ObjectId CreateLayer()
- {
- ObjectId layerId;
- Database db = HostApplicationServices.WorkingDatabase;
- Transaction trans = db.TransactionManager.StartTransaction();
- // Get the layer table first
- LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
- // Check if EmployeeLayer exists
- if (lt.Has(" EmployeeLayer "))
- {
- layerId = lt[" EmployeeLayer "];
- }
- else
- {
- // If not, create the layer here.
- LayerTableRecord ltr = new LayerTableRecord();
- ltr.Name = " EmployeeLayer "; // Set the layer name
- ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2);
- layerId = lt.Add(ltr);
- trans.AddNewlyCreatedDBObject(ltr, true);
- }
- trans.Commit();
- trans.Dispose();
- return layerId;
- }
- public ObjectId CreateDivision(string division, string manager)
- {
- Database db = HostApplicationServices.WorkingDatabase;
- Transaction trans = db.TransactionManager.StartTransaction();
- try
- {
- // First, get the NOD
- DBDictionary NOD = (DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
- // Define a corporate level dictionary
- DBDictionary acmeDict;
- try
- {
- // Just throw if it doesn't existdo nothing else
- acmeDict = (DBDictionary)trans.GetObject(NOD.GetAt(" ACME_DIVISION "), OpenMode.ForRead);
- }
- catch
- {
- // Doesn't exist, so create one, and set it in the NOD?
- acmeDict = new DBDictionary();
- NOD.SetAt(" ACME_DIVISION ", acmeDict);
- trans.AddNewlyCreatedDBObject(acmeDict, true);
- }
- // Now get the division we want from acmeDict
- DBDictionary divDict;
- try
- {
- divDict = (DBDictionary)trans.GetObject(acmeDict.GetAt(division), OpenMode.ForWrite);
- }
- catch
- {
- divDict = new DBDictionary();
- // Division doesn't exist, create one
- acmeDict.UpgradeOpen();
- acmeDict.SetAt(division, divDict);
- trans.AddNewlyCreatedDBObject(divDict, true);
- }
- // Now get the manager info from the division
- // We need to add the name of the division supervisor. We'll do this with another XRecord.
- Xrecord mgrXRec;
- try
- {
- mgrXRec = (Xrecord)trans.GetObject(divDict.GetAt(" Department Manager "), OpenMode.ForWrite);
- }
- catch
- {
- mgrXRec = new Xrecord();
- mgrXRec.Data = new ResultBuffer(new TypedValue((int)DxfCode.Text, manager));
- divDict.SetAt(" Department Manager ", mgrXRec);
- trans.AddNewlyCreatedDBObject(mgrXRec, true);
- }
- trans.Commit();
- // Return the department manager XRecord
- return mgrXRec.ObjectId;
- }
- finally
- {
- trans.Dispose();
- }
- }
- [CommandMethod(" EMPLOYEECOUNT ")]
- public void EmployeeCount()
- {
- Database db = HostApplicationServices.WorkingDatabase;
- Transaction trans = db.TransactionManager.StartTransaction(); // Start the transaction.
- int nEmployeeCount = 0;
- try
- {
- // First, get at the BlockTable, and the ModelSpace BlockTableRecord
- BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
- BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
- // Now, we need to be able to print to the commandline. Here is an object which will help us:
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- // Now, here is the fun part. This is where we iterate through ModelSpace:
- foreach (ObjectId id in btr)
- {
- Entity ent = (Entity)trans.GetObject(id, OpenMode.ForRead, false); // Use it to open the current object!
- if (ent.GetType() == typeof(BlockReference)) // We use .NET's RTTI to establish type.
- {
- nEmployeeCount += 1;
- }
- }
- ed.WriteMessage(" Employees Found: " + nEmployeeCount.ToString());
- trans.Commit();
- }
- finally
- {
- trans.Dispose();
- }
- }
- // We want a command which will go through and list all the relevant employee data.
- public static void ListEmployee(ObjectId employeeId, ref string[] saEmployeeList)
- {
- int nEmployeeDataCount = 0;
- Database db = HostApplicationServices.WorkingDatabase;
- Transaction trans = db.TransactionManager.StartTransaction(); // Start the transaction
- try
- {
- Entity ent = (Entity)trans.GetObject(employeeId, OpenMode.ForRead, false); // Use it to open the current object!
- if (ent.GetType() == typeof(BlockReference)) // We use .NET's RTTI to establish type.
- {
- // Not all BlockReferences will have our employee data, so we must make sure we can handle failure
- bool bHasOurDict = true;
- Xrecord EmployeeXRec = null;
- try
- {
- BlockReference br = (BlockReference)ent;
- DBDictionary extDict = (DBDictionary)trans.GetObject(br.ExtensionDictionary, OpenMode.ForRead, false);
- EmployeeXRec = (Xrecord)trans.GetObject(extDict.GetAt(" EmployeeData "), OpenMode.ForRead, false);
- }
- catch
- {
- bHasOurDict = false; // Something bad happenedour dictionary and/or XRecord is not accessible
- }
- if (bHasOurDict) // If obtaining the Extension Dictionary, and our XRecord is successful
- {
- // allocate memory for the list
- saEmployeeList = new String[4];
- TypedValue resBuf = EmployeeXRec.Data.AsArray()[0];
- saEmployeeList.SetValue(string.Format(" {0}\n ", resBuf.Value), nEmployeeDataCount);
- nEmployeeDataCount += 1;
- resBuf = EmployeeXRec.Data.AsArray()[1];
- saEmployeeList.SetValue(string.Format(" {0}\n ", resBuf.Value), nEmployeeDataCount);
- nEmployeeDataCount += 1;
- resBuf = EmployeeXRec.Data.AsArray()[2];
- string str = (string)resBuf.Value;
- saEmployeeList.SetValue(string.Format(" {0}\n ", resBuf.Value), nEmployeeDataCount);
- nEmployeeDataCount += 1;
- DBDictionary NOD = (DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead, false);
- DBDictionary acmeDict = (DBDictionary)trans.GetObject(NOD.GetAt(" ACME_DIVISION "), OpenMode.ForRead);
- DBDictionary salesDict = (DBDictionary)trans.GetObject(acmeDict.GetAt((string)EmployeeXRec.Data.AsArray()[2].Value), OpenMode.ForRead);
- Xrecord salesXRec = (Xrecord)trans.GetObject(salesDict.GetAt(" Department Manager "), OpenMode.ForRead);
- resBuf = salesXRec.Data.AsArray()[0];
- saEmployeeList.SetValue(string.Format(" {0}\n ", resBuf.Value), nEmployeeDataCount);
- nEmployeeDataCount += 1;
- }
- }
- trans.Commit();
- }
- finally
- {
- trans.Dispose();
- }
- }
- [CommandMethod(" PRINTOUTEMPLOYEE ")]
- public static void PrintoutEmployee()
- {
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- Database db = HostApplicationServices.WorkingDatabase;
- Transaction trans = db.TransactionManager.StartTransaction();
- try
- {
- BlockTable bt = (BlockTable)trans.GetObject(HostApplicationServices.WorkingDatabase.BlockTableId, OpenMode.ForRead);
- BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
- foreach (ObjectId id in btr)
- {
- Entity ent = (Entity)trans.GetObject(id, OpenMode.ForRead, false);
- if (ent is BlockReference)
- {
- string[] saEmployeeList = null;
- ListEmployee(id, ref saEmployeeList);
- if ((saEmployeeList.Length == 4))
- {
- ed.WriteMessage(" Employee Name: {0} ", saEmployeeList[0]);
- ed.WriteMessage(" Employee Salary: {0} ", saEmployeeList[1]);
- ed.WriteMessage(" Employee Division: {0} ", saEmployeeList[2]);
- ed.WriteMessage(" Division Manager: {0} ", saEmployeeList[3]);
- }
- }
- }
- }
- finally
- {
- }
- }
- [CommandMethod(" CREATE ")]
- public void CreateEmployee()
- {
- Database db = HostApplicationServices.WorkingDatabase;
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- Transaction trans = db.TransactionManager.StartTransaction();
- try
- {
- string empName = " Earnest Shackleton ";
- string divName = " Sales ";
- double salary = new double();
- salary = 10000;
- Point3d position = new Point3d(0, 0, 0);
- bool gotPosition = new bool();
- // boolean to check if a point has been entered
- gotPosition = false;
- // Prompts for each employee detail
- PromptStringOptions prName = new PromptStringOptions(" Enter Employee Name < " + empName + " > ");
- PromptStringOptions prDiv = new PromptStringOptions(" Enter Employee Division < " + divName + " > ");
- PromptDoubleOptions prSal = new PromptDoubleOptions(" Enter Employee Salary < " + salary + " > ");
- PromptPointOptions prPos = new PromptPointOptions(" Enter Employee Position or ");
- // Add keywords when prompting for position
- prPos.Keywords.Add(" Name ");
- prPos.Keywords.Add(" Division ");
- prPos.Keywords.Add(" Salary ");
- // Set conditions for prompting
- prPos.AllowNone = false; // Do not allow null values
- // prompt results
- PromptResult prNameRes;
- PromptResult prDivRes;
- PromptDoubleResult prSalRes;
- PromptPointResult prPosRes;
- // Loop to get employee details. Exit the loop when positon is entered
- while (!gotPosition)
- {
- // Prompt for position
- prPosRes = ed.GetPoint(prPos);
- // Got a point
- if (prPosRes.Status == PromptStatus.OK)
- {
- gotPosition = true;
- position = prPosRes.Value;
- }
- else if (prPosRes.Status == PromptStatus.Keyword) // Got a keyword
- {
- // Name keyword entered
- if (prPosRes.StringResult == " Name ")
- {
- // Get employee name
- prName.AllowSpaces = true;
- prNameRes = ed.GetString(prName);
- if (prNameRes.Status != PromptStatus.OK)
- {
- return;
- }
- // we got the employee name successfully
- if (prNameRes.StringResult != "")
- {
- empName = prNameRes.StringResult;
- }
- }
- // Division keyword entered
- if (prPosRes.StringResult == " Division ")
- {
- // Get employee division
- prDiv.AllowSpaces = true;
- prDivRes = ed.GetString(prDiv);
- if (prDivRes.Status != PromptStatus.OK)
- {
- return;
- }
- if (prDivRes.StringResult != "")
- {
- divName = prDivRes.StringResult;
- }
- } // Division
- // Salary keyword entered
- if (prPosRes.StringResult == " Salary ")
- {
- // Get employee salary
- prSal.AllowNegative = false;
- prSal.AllowNone = true;
- prSal.AllowZero = false;
- prSalRes = ed.GetDouble(prSal);
- if (prSalRes.Status != PromptStatus.OK & prSalRes.Status != PromptStatus.None)
- {
- return;
- }
- if (prSalRes.Status != PromptStatus.None)
- {
- salary = prSalRes.Value;
- }
- } // Salary
- }
- else
- {
- // Error in getting a point
- ed.WriteMessage(" ***Error in getting a point, exiting!!*** " + " \r\n ");
- return;
- } // If got a point
- }
- // Create the Employee
- CreateEmployee(empName, divName, salary, position);
- string manager = "";
- // Now create the division
- // Pass an empty string for manager to check if it already exists
- Xrecord depMgrXRec;
- ObjectId xRecId;
- xRecId = CreateDivision(divName, manager);
- // Open the department manager XRecord
- depMgrXRec = (Xrecord)trans.GetObject(xRecId, OpenMode.ForRead);
- TypedValue[] typedVal = depMgrXRec.Data.AsArray();
- foreach (TypedValue val in typedVal)
- {
- string str;
- str = (string)val.Value;
- if (str == "")
- {
- // Manager was not set, now set it
- // Prompt for manager name first
- ed.WriteMessage(" \r\n ");
- PromptStringOptions prManagerName = new PromptStringOptions(" No manager set for the division! Enter Manager Name ");
- prManagerName.AllowSpaces = true;
- PromptResult prManagerNameRes = ed.GetString(prManagerName);
- if (prManagerNameRes.Status != PromptStatus.OK)
- {
- return;
- }
- // Set a manager name
- depMgrXRec.Data = new ResultBuffer(new TypedValue((int)DxfCode.Text, prManagerNameRes.StringResult));
- }
- }
- trans.Commit();
- }
- finally
- {
- trans.Dispose();
- }
- }
- [CommandMethod(" LISTEMPLOYEES ")]
- public void List()
- {
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- try
- {
- PromptSelectionOptions Opts = new PromptSelectionOptions();
- TypedValue[] filList = new TypedValue[1];
- // Build a filter list so that only block references are selected
- filList[0] = new TypedValue((int)DxfCode.Start, " INSERT ");
- SelectionFilter filter = new SelectionFilter(filList);
- PromptSelectionResult res = ed.GetSelection(Opts, filter);
- // Do nothing if selection is unsuccessful
- if (res.Status != PromptStatus.OK)
- return;
- Autodesk.AutoCAD.EditorInput.SelectionSet SS = res.Value;
- ObjectId[] idArray;
- idArray = SS.GetObjectIds();
- string[] saEmployeeList = new string[4];
- // collect all employee details in saEmployeeList array
- foreach (ObjectId employeeId in idArray)
- {
- ListEmployee(employeeId, ref saEmployeeList);
- // Print employee details to the command line
- foreach (string employeeDetail in saEmployeeList)
- {
- ed.WriteMessage(employeeDetail);
- }
- // separator
- ed.WriteMessage(" ---------------------- " + " \r\n ");
- }
- }
- finally
- {
- }
- }
- [CommandMethod(" Test ")]
- public void Test()
- {
- CreateDivision(" Sales ", " Randolph P. Brokwell ");
- }
- }
- }
|
|