Судя по всему, для метода 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>
Update 19.09.2019 11:40Проверил идею. После того как я добавил данные о новом классе в ATC-файл, код отработал без ошибок и конструкция добавилась в чертёж.