Create Assembly with SubAssembly in C#

Create Assembly with SubAssembly in C#

alexis.nunez98YHM
Contributor Contributor
1,280 Views
4 Replies
Message 1 of 5

Create Assembly with SubAssembly in C#

alexis.nunez98YHM
Contributor
Contributor

Hi,

 

I'm trying to create Civil3d assembly with connected subassembly. I'm trying to access the Assembly group but no avail. Im using 2023 version of Civil3d. 

 

Please check the below code that I created:

 

 

void _CreateAssembly_1()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            CivilDocument civilDoc = CivilDocument.GetCivilDocument(doc.Database);
            Point3d pntLoc = cSelection.Select_Point3d("Select Target Location");
 
            if (pntLoc == new Point3d(0, 0, 0)) return;
            using (doc.LockDocument())
            {
                using (Transaction tr = doc.TransactionManager.StartTransaction())
                {
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                    //acc3db.Assembly oAsm = new acc3db.Assembly();
 
                    ObjectId AssemblyId = civilDoc.AssemblyCollection.Add("test2", acc3db.AssemblyType.Other, pntLoc);
 
                    acc3db.Subassembly asm = AssemblyId.GetObject(OpenMode.ForWrite) as acc3db.Subassembly;
 
                    //civilDoc.SubassemblyCollection.Add("GEC_Carriageway_5layer",)
 
                    listBox1.Items.Clear();
                    // List Sub Assembly
                    foreach (var o in civilDoc.SubassemblyCollection)
                    {
                        acc3db.Subassembly subasm = o.GetObject(OpenMode.ForRead) as acc3db.Subassembly;
                        listBox1.Items.Add("  " + subasm.Name + " - " + subasm.Name);
                    }
                     
                    // Create the CW subassembly                    
                    ObjectId subAsmId_R = civilDoc.SubassemblyCollection.ImportSubassembly("GEC_Carriageway_5layer_R_2", @"C:\ProgramData\Autodesk\C3D 2023\enu\Imported Tools\GEC_Carriageway_5_layer\af8a6c22d9e746f895aad89dcfcc3f42.atc", "43365f65-e04b-4df4-98ba-c308d3e806b4", pntLoc.Add(new Vector3d(0, 0, 0)));
                    ObjectId subAsmId_L = civilDoc.SubassemblyCollection.ImportSubassembly("GEC_Carriageway_5layer_L_2", @"C:\ProgramData\Autodesk\C3D 2023\enu\Imported Tools\GEC_Carriageway_5_layer\af8a6c22d9e746f895aad89dcfcc3f42.atc", "43365f65-e04b-4df4-98ba-c308d3e806b4", pntLoc.Add(new Vector3d(0, 0, 0)));
 
                    acc3db.Subassembly sub = (acc3db.Subassembly)subAsmId_R.GetObject(OpenMode.ForWrite);
                    acc3db.Subassembly sub_L = (acc3db.Subassembly)subAsmId_L.GetObject(OpenMode.ForWrite);
 
                    foreach (var o in sub_L.ParamsLong)
                    {
                        if (o.DisplayName.ToUpper() == "SIDE") o.Value = 1;
                    }
                    tr.Commit();
                }
            }
        }

 

 

0 Likes
Accepted solutions (1)
1,281 Views
4 Replies
Replies (4)
Message 2 of 5

465340553
Mentor
Mentor

465340553_0-1698279221640.png

 

王磊
您认为此帖子是否有用?欢迎为此帖点赞。
您的问题是否已得到解答?请点击“接受解答”按钮。

EESignature

0 Likes
Message 3 of 5

alexis.nunez98YHM
Contributor
Contributor

Thank I was able to correct the code. Now my problem is to add another subassembly which is connected to subassembly. 

 

                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                    //acc3db.Assembly oAsm = new acc3db.Assembly();

                    ObjectId AssemblyId = civilDoc.AssemblyCollection.Add("test2", acc3db.AssemblyType.Other, pntLoc);

                    acc3db.Assembly asm = AssemblyId.GetObject(OpenMode.ForWrite) as acc3db.Assembly;

                    

                    //civilDoc.SubassemblyCollection.Add("GEC_Carriageway_5layer",)

                    listBox1.Items.Clear();
                    // List Sub Assembly
                    listBox1.Items.Add("------------ SubAssembly Collection START - " + civilDoc.SubassemblyCollection.Count);
                    foreach (var o in civilDoc.SubassemblyCollection)
                    {
                        acc3db.Subassembly subasm = o.GetObject(OpenMode.ForRead) as acc3db.Subassembly;
                        listBox1.Items.Add("  " + subasm.Name + " - " + subasm.Name);
                    }
                    listBox1.Items.Add("------------ END - " + civilDoc.SubassemblyCollection.Count);

                    // Create the CW subassembly
                    //ObjectId subAsmId = civilDoc.SubassemblyCollection.ImportSubassembly("GEC_Carriageway_5layer", @"C:\ProgramData\Autodesk\C3D 2023\enu\Imported Tools\GEC_Carriageway_5_layer\af8a6c22d9e746f895aad89dcfcc3f42.atc", "{2fb63dad-6d59-4bed-9de7-d90f091e4a29}", pntLoc.Add(new Vector3d(0,2,0)));
                    ObjectId subAsmId_R = civilDoc.SubassemblyCollection.ImportSubassembly("GEC_Carriageway_5layer_R_2", @"C:\ProgramData\Autodesk\C3D 2023\enu\Imported Tools\GEC_Carriageway_5_layer\af8a6c22d9e746f895aad89dcfcc3f42.atc", "43365f65-e04b-4df4-98ba-c308d3e806b4", pntLoc.Add(new Vector3d(0, 0, 0)));
                    ObjectId subAsmId_L = civilDoc.SubassemblyCollection.ImportSubassembly("GEC_Carriageway_5layer_L_2", @"C:\ProgramData\Autodesk\C3D 2023\enu\Imported Tools\GEC_Carriageway_5_layer\af8a6c22d9e746f895aad89dcfcc3f42.atc", "43365f65-e04b-4df4-98ba-c308d3e806b4", pntLoc.Add(new Vector3d(0, 0, 0)));

                    acc3db.Subassembly sub = (acc3db.Subassembly)subAsmId_R.GetObject(OpenMode.ForWrite);
                    acc3db.Subassembly sub_L = (acc3db.Subassembly)subAsmId_L.GetObject(OpenMode.ForWrite);


                     
                    acc3db.AssemblyGroup AsmGrp_R = asm.AddSubassembly(subAsmId_R);
                    AsmGrp_R.Name = "Right";
                    acc3db.AssemblyGroup AsmGrp_L = asm.AddSubassembly(subAsmId_L);
                    AsmGrp_L.Name = "Left";

                    UpdateSubAssemblyParameters(sub_L, "Side", "1");

 

The output of the above code is this:

alexisnunez98YHM_0-1698324958210.png

 

 

I want to add another subassembly like the one below:

alexisnunez98YHM_1-1698325046462.png

 

Can you provide a sample pls.

 

 

0 Likes
Message 4 of 5

465340553
Mentor
Mentor
Accepted solution

465340553_0-1698367968101.png

 I'm also creating assembly with code for the first time.

Civil 3d 2018

public void C_AssTest()
{

    Document doc = Application.DocumentManager.MdiActiveDocument;

    var assId = CivilApplication.ActiveDocument.AssemblyCollection.Add("Test", AssemblyType.UndividedCrownedRoad, Point3d.Origin);
    var subAssId1 = CivilApplication.ActiveDocument.SubassemblyCollection.ImportStockSubassembly("BaseLane", "Subassembly.BasicLane", Point3d.Origin);
    var subAssId2 = CivilApplication.ActiveDocument.SubassemblyCollection.ImportStockSubassembly("ShapeTrapezoidal", "Subassembly.ShapeTrapezoidal", Point3d.Origin);

    using (Transaction tr = doc.TransactionManager.StartTransaction())
    {
        var ass = assId.GetObject(OpenMode.ForWrite) as Assembly;
        var assGroup1 = ass.AddSubassembly(subAssId1);
        assGroup1.Name = "Right";

        var assgroup2 = ass.MirrorSubassembly(subAssId1);
        assgroup2.Name = "Left";

        var subAss1 = subAssId1.GetObject(OpenMode.ForRead) as Subassembly;
        var subAss2 = assgroup2.GetSubassemblyIds()[0].GetObject(OpenMode.ForRead) as Subassembly;

        // Find Right Top Point
        var pt1 = (from x in subAss1.Points
                   orderby x.Offset descending, x.Elevation descending
                   select x).First();
        // add Second Subassembly to Right Group
        if (pt1 != null)
        {
            ass.AddSubassembly(subAssId2, pt1);
        }
        var pt2 = (from x in subAss2.Points
                   orderby x.Offset descending, x.Elevation descending
                   select x).First();
        if (pt2 != null)
        {
            ass.MirrorSubassembly(subAssId2, pt2);
        }
        tr.Commit();
    }
}

 

465340553_1-1698368191920.png

 

王磊
您认为此帖子是否有用?欢迎为此帖点赞。
您的问题是否已得到解答?请点击“接受解答”按钮。

EESignature

Message 5 of 5

alexis.nunez98YHM
Contributor
Contributor

I managed to find a solution but your sample here is better. I think I will use this kind of approach.
Thank you very much!

0 Likes