关于autocad .net二次开发的初学者疑问

一段在 使用ObjectIds 的代码,是在autocad.net开发手册上面摘抄的一段代码,但或许是还有什么namespace没有引用,编译会出现错误
[code=csharp]using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Internal;
using Autodesk.AutoCAD.Interop.Common;

namespace help2
{
class Object
{

    Document acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
    Transaction acTrans = acCurDb.TransactionManager.StartTransaction();

    LayerTableRecord acLyrTblRec ;
    acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero,OpenMode.ForRead) as LayerTableRecord;

    acTrans.Dispose();

}

}
[/code]
http://img.bbs.csdn.net/upload/201502/14/1423902708_150151.jpg

如图,很多地方说cannot resolve symbol

请问我是哪里错了,跪谢

也可能是代码里使用using,但没有通过以下方式添加对应的引用的原因:
图片说明

没有做过这方面的,看错误提示是因为还有什么namespace没有引用。

参考以下代码:

 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
    }

    #region CreateEmployeeDefinition
    // This function returns the ObjectId for the BlockTableRecord called "EmployeeBlock",
    // creating it if necessary.  The block contains three entities - circle, text 
    // and ellipse.
    private ObjectId CreateEmployeeDefinition()
    {
      ObjectId newBtrId = new ObjectId(); //The return value for this function
      Database db = HostApplicationServices.WorkingDatabase; //save some space
      using (Transaction trans = db.TransactionManager.StartTransaction()) //begin the transaction
      {
        // Now, access 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(0, 0, 0); 
          // Declare and define the entities we want to add:
          // Circle:
          Circle circle = new Circle(center, Vector3d.ZAxis, 2);

          // 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!
      }
      return newBtrId;
    }
#endregion

    #region CreateEmployeeCommand
      [CommandMethod("CREATE")]
      public void Create()
      {
          Database db = HostApplicationServices.WorkingDatabase;
          Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
          try
          {
              using (Transaction trans = db.TransactionManager.StartTransaction())
              {
                  //Prompts for each employee detail
                  PromptStringOptions prName = new PromptStringOptions("Enter Employee Name");
                  PromptStringOptions prDiv = new PromptStringOptions("Enter Employee Division");
                  PromptDoubleOptions prSal = new PromptDoubleOptions("Enter Employee 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 the default values for each of these
                  prName.Message = "Earnest Shackleton";
                  prDiv.Message = "Sales";
                  prSal.Message ="10000.0f";

                  //Set conditions for prompting
                  prPos.AllowNone = false; //Do not allow null values

                  //prompt results - set explicitly to null 
                  PromptResult prNameRes = null;
                  PromptResult prDivRes = null;
                  PromptDoubleResult prSalRes = null;
                  PromptPointResult prPosRes = null;

                  //Loop to get employee details. Exit the loop when positon is entered
                  while (prPosRes == null || prPosRes.Status != PromptStatus.OK)
                  {
                      //Prompt for position
                      prPosRes = ed.GetPoint(prPos);
                      if (prPosRes.Status == PromptStatus.Keyword) //Got a keyword
                      {
                          switch (prPosRes.StringResult)
                          {
                              case "Name":
                                  //Get employee name
                                  prName.AllowSpaces = true;
                                  prNameRes = ed.GetString(prName);
                                  if (prNameRes.Status != PromptStatus.OK)
                                      throw new System.Exception("Error or User Cancelled");
                                  break;
                              case "Division":
                                  //Get employee division
                                  prDiv.AllowSpaces = true;
                                  prDivRes = ed.GetString(prDiv);
                                  if (prDivRes.Status != PromptStatus.OK)
                                      throw new System.Exception("Error or User Cancelled");
                                  break;
                              case "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)
                                      throw new System.Exception("Error or User Cancelled");
                                  break;
                          }
                      }
                      if (prPosRes.Status == PromptStatus.Cancel || prPosRes.Status == PromptStatus.Error)
                          throw new System.Exception("Error or User Cancelled");
                  }

                  //Create the Employee - either use the input value or the default value...
                  string empName = (prNameRes == null ? prName.Message : prNameRes.StringResult);
                  string divName = (prDivRes == null ? prDiv.Message : prDivRes.StringResult);
                  double salary = (prSalRes == null ? Convert.ToDouble( prSal.Message) : prSalRes.Value);

                  CreateEmployee(empName, divName, salary, prPosRes.Value);


                  //Now create the division 
                  //Pass an empty string for manager to check if it already exists
                  string manager = "";
                  ObjectId xRecId = CreateDivision(divName, manager);

                  //Open the department manager XRecord
                  Xrecord depMgrXRec = (Xrecord)trans.GetObject(xRecId, OpenMode.ForRead);
                  TypedValue[] typedVal = depMgrXRec.Data.AsArray();
                  foreach (TypedValue val in typedVal)
                  {
                      string 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.Message = "Delton T. Cransley";
                          prManagerName.AllowSpaces = true;
                          PromptResult prManagerNameRes = ed.GetString(prManagerName);
                          if (prManagerNameRes.Status != PromptStatus.OK)
                              throw new System.Exception("Error or User Cancelled");
                          //Set a manager name
                          depMgrXRec.Data = new ResultBuffer(new TypedValue((int)DxfCode.Text, prManagerNameRes.StringResult));
                      }
                  }
                  trans.Commit();
              }
          }
          catch (System.Exception ex)
          {
              ed.WriteMessage("\nError: "   ex.Message   "\n");
          }
      }
    #endregion

    #region CreateEmployee
    // This function creates a new BlockReference to the "EmployeeBlock" object,
    // and adds it to ModelSpace.
    private ObjectId CreateEmployee(string name, string division, double salary, Point3d pos)
    {
      // get the current working database
      Database db = HostApplicationServices.WorkingDatabase;
      using (Transaction trans = db.TransactionManager.StartTransaction())
      {
        BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForWrite));
        BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
        // Create the block reference...use the return from CreateEmployeeDefinition directly!
        BlockReference br = new BlockReference(pos, CreateEmployeeDefinition());

        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 RunTimeTypeInformation (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);

        ObjectId retId = br.ObjectId;
        trans.Commit();

        return retId;
      }
    }
    #endregion

    #region CreateLayer
    // This function returns the objectId for the "EmployeeLayer", creating it if necessary.
    private ObjectId CreateLayer()
    {
      ObjectId layerId;
      Database db = HostApplicationServices.WorkingDatabase;
      using (Transaction trans = db.TransactionManager.StartTransaction())
      {
        // open the layer table for read first, to check to see if the requested layer exists
        LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
        // 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);
          // upgrade the open from read to write
          lt.UpgradeOpen();
          // now add the new layer
          layerId = lt.Add(ltr);
          trans.AddNewlyCreatedDBObject(ltr, true);
          trans.Commit(); // Only need to commit when we have made a change!
        }
      }
      return layerId;
    }
    #endregion

    #region CreateDivision
    private ObjectId CreateDivision(string division, string manager)
    {
      ObjectId retId = ObjectId.Null;
      Database db = HostApplicationServices.WorkingDatabase;
      using (Transaction trans = db.TransactionManager.StartTransaction())
      {
        // First, get the Named Objects Dictionary (NOD)...
        DBDictionary NOD = (DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
        // Define a corporate level dictionary
        DBDictionary acmeDict;

        // here's another way to check to see if an entry exists, using try/catch instead of has[]
        try
        {
          // Just throw if it doesn't exist...do 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);
        }

        // Return the department manager XRecord
        retId = mgrXRec.ObjectId;
        trans.Commit();
      }
      return retId;
    }
    #endregion

    #region EmployeeCountCommand
    [CommandMethod("EMPLOYEECOUNT")]
    public void EmployeeCount()
    {
      // get the working database
      Database db = HostApplicationServices.WorkingDatabase;

      // we need to be able to print to the commandline.  Here is an object which will help us:
      Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

      try
      {
        // Start the transaction.
        using (Transaction trans = db.TransactionManager.StartTransaction())  
        {
          int nEmployeeCount = 0;
          // 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);

          // 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();
        }
      }
      catch (System.Exception ex)
      {
        ed.WriteMessage("Error Counting Employees: "   ex.Message);
      }
    }
    #endregion

    #region ListEmployee
    //We want a command which will go through and list all the relevant employee data.
    private static void ListEmployee(ObjectId employeeId, ref string[] saEmployeeList)
    {
      Database db = HostApplicationServices.WorkingDatabase;
      // Start the transaction
      using (Transaction trans = db.TransactionManager.StartTransaction()) 
      {
        int nEmployeeDataCount = 0;
        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
          {
            // something bad happened...our dictionary and/or XRecord is not accessible for some reason
            bHasOurDict = false; 
          }

          // If obtaining the Extension Dictionary, and our XRecord is successful...
          if (bHasOurDict) 
          {
            // 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();
      }
    }
    #endregion

    #region ListEmployeesCommand
    [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");
        }
      }
      catch (System.Exception ex)
      {
        ed.WriteMessage("Error Listing Employees: "   ex.Message);
      }
    }
    #endregion

    #region PrintoutEmployeeCommand
    [CommandMethod("PRINTOUTEMPLOYEE")]
    public static void PrintoutEmployee()
    {
      Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
      Database db = HostApplicationServices.WorkingDatabase;
      try
      {
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
          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]);
              }
            }
          }
        }
      }
      catch (System.Exception ex)
      {
        ed.WriteMessage("Error Printing Out Employees: "   ex.Message);
      }
    }
    #endregion    

    #region TestCommand
    [CommandMethod("Test")]
    public void Test()
    {
      Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
      try
      {
        CreateDivision("Sales", "Randolph P. Brokwell");
      }
      catch (System.Exception ex)
      {
        ed.WriteMessage("Error in Test Command: "   ex.Message);
      }
    }
    #endregion
  }
}