.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to add new layers to a side db?

1 REPLY 1
SOLVED
Reply
Message 1 of 2
swaywood
200 Views, 1 Reply

How to add new layers to a side db?

Hi,

I want to add a new layer A to a side db.

And there are some dbtexts in the side db.

I want to set the dbtext's layers  to A.

 

thanks.

 

 

    [CommandMethod("W7")]
    public void W7()
    {
      Database db = HostApplicationServices.WorkingDatabase;

      using (Transaction trans = db.TransactionManager.StartTransaction())
      {
        try
        {
          using (Database dbInsert = new Database(false, true))
          {
            string sDwg = @"D:\B.dwg";
            dbInsert.ReadDwgFile(sDwg, System.IO.FileShare.ReadWrite, true, null);

            Autodesk.AutoCAD.DatabaseServices.TransactionManager sideTm = dbInsert.TransactionManager;
            using (Transaction sideTr = sideTm.StartTransaction())
            {
              ObjectId id = dbInsert.NewLayer("A", 5, "continues", "acadiso.lin", LineWeight.LineWeight015, false, false, false, false, false);
              sideTr.Commit();
            }

            using (Transaction sideTr = sideTm.StartTransaction())
            {
              BlockTable bt = (BlockTable)sideTm.GetObject(dbInsert.BlockTableId, OpenMode.ForRead, false);
              BlockTableRecord modelspace = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForRead);

              foreach (ObjectId id in modelspace)
              {
                try
                {
                  if (id.IsErased) continue;

                  Entity ent = (Entity)sideTr.GetObject(id, OpenMode.ForWrite, false);
                  ent.Layer = "B";
                  ent.DowngradeOpen();
                }
                catch
                {

                }
              }

              sideTr.Commit();
            }

            dbInsert.RetainOriginalThumbnailBitmap = true;
            dbInsert.SaveAs(sDwg, DwgVersion.AC1027);

            trans.Commit();
          }
        }
        catch
        {
        }
      }
    }

 

    public static ObjectId NewLayer(this Database db, string layerName, short colorIndex, string lineType, string lineTypeFile, LineWeight lineWeight, bool bIsPlot, bool bIsOff, bool bIsFreezed, bool bIsLocked, bool bIsCurrent)
    {
      Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor;
      colorIndex = (short)(colorIndex % 256);
      ObjectId idRet = ObjectId.Null;
      try
      {
        using (Transaction trans = (Transaction)db.TransactionManager.StartTransaction())
        {
          LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
          LayerTableRecord ltr = new LayerTableRecord();
          ltr.Name = layerName;

          ltr.IsOff = bIsOff;
          ltr.IsFrozen = bIsFreezed;
          ltr.IsLocked = bIsLocked;
          ltr.IsPlottable = bIsPlot;
          ltr.Color = CadColor.FromColorIndex(CadColors.ColorMethod.ByColor, colorIndex);
          ltr.LineWeight = lineWeight;
          ltr.LinetypeObjectId = db.LoadLineType(lineType, lineTypeFile);
          idRet = lt.Add(ltr);
          trans.AddNewlyCreatedDBObject(ltr, true);
          if (bIsCurrent)
            db.Clayer = idRet;
          trans.Commit();
        }
      }
      catch (System.Exception ex)
      {

      }
      return idRet;
    }

 

1 REPLY 1
Message 2 of 2
_gile
in reply to: swaywood

Hi,

 

This works for me:

 

[CommandMethod("TEST2")]
public static void Test2()
{
    string fileName = @"D:\B.dwg";
    using (var db = new Database(false, true))
    {
        db.ReadDwgFile(fileName, FileOpenMode.OpenForReadAndAllShare, false, null);
        using (var tr = db.TransactionManager.StartTransaction())
        {
            db.AddLayer("A", 5, "Continuous", "acadiso.lin", LineWeight.LineWeight015, false);
            var modelSpace = (BlockTableRecord)tr.GetObject(
                SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
            foreach (ObjectId id in modelSpace)
            {
                if (id.ObjectClass.Name == "AcDbText")
                {
                    var text = (DBText)tr.GetObject(id, OpenMode.ForWrite);
                    text.Layer = "A";
                }
            }
            tr.Commit();
        }
        db.SaveAs(fileName, DwgVersion.AC1027);
    }
}

 

 

 

The extension method (it checks if the layer already exists in the LayerTable of the database ans uses some default parameters).

 

public static ObjectId AddLayer(
    this Database db, 
    string layerName, 
    short colorIndex, 
    string lineType, 
    string lineTypeFile, 
    LineWeight lineWeight = LineWeight.ByLineWeightDefault, 
    bool isPlottable = true, 
    bool isOff = false, 
    bool isFrozen = false, 
    bool isLocked = false, 
    bool isCurrent = false)
{
    ObjectId layerId;
    LayerTableRecord layer;
    using (var tr = db.TransactionManager.StartTransaction())
    {
        var layerTable = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
        if (layerTable.Has(layerName))
        {
            layerId = layerTable[layerName];
            layer = (LayerTableRecord)tr.GetObject(layerId, OpenMode.ForWrite);
        }
        else
        {
            tr.GetObject(db.LayerTableId, OpenMode.ForWrite);
            layer = new LayerTableRecord();
            layer.Name = layerName;
            layerId = layerTable.Add(layer);
            tr.AddNewlyCreatedDBObject(layer, true);
        }
        var linetypeTable = (LinetypeTable)tr.GetObject(db.LinetypeTableId, OpenMode.ForRead);
        if (!linetypeTable.Has(lineType))
        {
            db.LoadLineTypeFile(lineType, lineTypeFile);
        }
        layer.Color = Color.FromColorIndex(ColorMethod.ByAci, colorIndex);
        layer.LinetypeObjectId = linetypeTable[lineType];
        layer.LineWeight = lineWeight;
        layer.IsPlottable = isPlottable;
        layer.IsOff = isOff;
        layer.IsFrozen = isFrozen;
        layer.IsLocked = isLocked;
        if (isCurrent)
            db.Clayer = layerId;
        tr.Commit();
    }
    return layerId;
}

 

 

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

AutoCAD Inside the Factory


Autodesk Design & Make Report