Судя по всему, для метода ImportStockSubassembly нужно чтобы конструкция содержалась в файле APC (Т.к. "под капотом" этот метод использует загрузку из файла методом ImportSubassembly, внимание на строки 32 и 36):
- public unsafe ObjectId ImportStockSubassembly(string subassemblyName, string className, Point3d location) 
- { 
-         //IL_009a: Unknown result type (might be due to invalid IL or missing references) 
-         //IL_009b: Unknown result type (might be due to invalid IL or missing references) 
-         //IL_00a0: Unknown result type (might be due to invalid IL or missing references) 
-         //IL_00cf: Unknown result type (might be due to invalid IL or missing references) 
-         //IL_00fb: Unknown result type (might be due to invalid IL or missing references) 
-         checkSubassemblyNameValid(subassemblyName); 
-         string paramName = "className"; 
-         if (null == className) 
-         { 
-                 throw new ArgumentNullException(paramName); 
-         } 
-         byte b = (className.Trim().Length > 0) ? ((byte)1) : ((byte)0); 
-         string message = "className should be at least one character."; 
-         if (0 == b) 
-         { 
-                 throw new ArgumentException(message); 
-         } 
-         string stockSubassemblyFolder = getStockSubassemblyFolder(); 
-         AecRmCString aecRmCString; 
-         ObjectId result; 
-         if (stockSubassemblyFolder != (string)null && stockSubassemblyFolder.Length > 0) 
-         { 
-                 global::<Module>.AecRmCString.{ctor}(&aecRmCString); 
-                 AecRmCString aecRmCString2; 
-                 try 
-                 { 
-                         global::<Module>.AecRmCString.{ctor}(&aecRmCString2); 
-                         try 
-                         { 
-                                 if (getAtcFilePathAndItemId(stockSubassemblyFolder, className, &aecRmCString, &aecRmCString2)) // <--- !!!! 
-                                 { 
-                                         char* value = global::<Module>.ATL.CSimpleStringT<wchar_t,1>.GetString((CSimpleStringT<wchar_t,1>*)(&aecRmCString2)); 
-                                         char* value2 = global::<Module>.ATL.CSimpleStringT<wchar_t,1>.GetString((CSimpleStringT<wchar_t,1>*)(&aecRmCString)); 
-                                         result = ImportSubassembly(subassemblyName, new string(value2), new string(value), location); // <--- !!! 
-                                 // .... итд 
У себя нашёл, что BasicLane описана тут: C:\ProgramData\Autodesk\C3D 2018\rus\Tool Catalogs\Road Catalog\C3D Metric Basic Subassembly Catalog.atc
Подозреваю, что надо туда внести и BasicLane2.
Если используются "имперские" единицы, то изменения надо вносить в этот файл: C:\ProgramData\Autodesk\C3D 2018\rus\Tool Catalogs\Road Catalog\C3D Imperial Basic Subassembly Catalog.atc
- [return: MarshalAs(UnmanagedType.U1)] 
- private unsafe bool getAtcFilePathAndItemId(string stockSubassemblyFolderPath, string className, AecRmCString* strActFilePath, AecRmCString* strItemId) 
- { 
-         AeccUnitBase.SettingsUnits settingsUnits = global::<Module>.AeccUnitBase.GetDrawingUnit(GetImpObj(), 0); 
-         bool flag = global::<Module>.AeccUnitBase.IsMetric(settingsUnits); 
-         bool flag2 = global::<Module>.AeccUnitBase.IsImperial(settingsUnits); 
-         string[] files = Directory.GetFiles(stockSubassemblyFolderPath, "*.atc", SearchOption.TopDirectoryOnly); 
-         int num = 0; 
-         if (0L < (long)(IntPtr)(void*)files.LongLength) 
-         { 
-                 do 
-                 { 
-                         string text = files[num]; 
-                         string fileName = Path.GetFileName(text); 
-                         if ((flag && fileName.StartsWith("C3D Metric")) || (flag2 && fileName.StartsWith("C3D Imperial"))) // <--- !!!! 
-                         { 
-                                 XmlDocument xmlDocument = global::<Module>.?A0x671e1822.loadXmlDocument(text); 
-                                 if (xmlDocument != null) 
-                                 { 
-                                 // ... итд 
Фрагмент файла ATC (Imperial):
- <Tool> 
-         <ItemID idValue="{32BCCC1B-5F68-4B1A-A0E6-B8CB9C37034D}"/> 
-         <Properties> 
-         <ItemName resource="501" src="AeccStockSubassemblyScriptsRC.dll"/> 
-                 <Images> 
-                         <Image cx="64" cy="64" src=".\Images\AeccBasicLane.png"/> 
-                 </Images> 
-         <Description resource="502" src="AeccStockSubassemblyScriptsRC.dll"/> 
-                 <Keywords>_lane subassembly</Keywords> 
-                 <Help> 
-                         <HelpFile>WBH</HelpFile> 
-                         <HelpCommand>HELP_HHWND_TOPIC</HelpCommand> 
-                         <HelpData>SA_BasicLane</HelpData> 
-                 </Help> 
-                 <Time createdUniversalDateTime="2002-04-05T21:58:00" modifiedUniversalDateTime="2002-04-05T21:58:00"/> 
-         </Properties> 
-         <Source/> 
-         <StockToolRef idValue="{7F55AAC0-0256-48D7-BFA5-914702663FDE}"/> 
-         <Data> 
-                 <AeccDbSubassembly> 
-                         <GeometryGenerateMode>UseDotNet</GeometryGenerateMode> 
-                 <DotNetClass Assembly="%AECCCONTENT_DIR%\C3DStockSubassemblies.dll">Subassembly.BasicLane</DotNetClass> 
-             <Resource Module="AeccStockSubassemblyScriptsRC.dll"/> 
-                         <Params> 
-                                 <Version DataType="String" DisplayName="503" Description="504">R2017</Version> 
-                                 <Side DataType="Long" DisplayName="505" Description="506">0 
-                     <Enum> 
-                                                 <Right DisplayName="507">0</Right> 
-                                                 <Left DisplayName="508">1</Left> 
-                                         </Enum> 
-                                 </Side> 
-                                 <Width DataType="Double" TypeInfo="16" DisplayName="509" Description="510">12.0</Width> 
-                                 <Depth DataType="Double" TypeInfo="16" DisplayName="511" Description="512">0.67</Depth> 
-                                 <Slope DataType="Double" TypeInfo="9"  DisplayName="513" Description="514">-0.02</Slope> 
-                         </Params> 
-                 </AeccDbSubassembly> 
-                 <Units>foot</Units> 
-         </Data> 
- </Tool> 
-   
Проверил идею. После того как я добавил данные о новом классе в ATC-файл, код отработал без ошибок и конструкция добавилась в чертёж.