欧特克设计自动化

Posted

技术标签:

【中文标题】欧特克设计自动化【英文标题】:autodesk design automation 【发布时间】:2018-06-20 19:31:26 【问题描述】:

致命错误:未处理的访问冲突在 1d8257a5h 读取 0x0008 异常

失败的缺失输出

【问题讨论】:

嗨。 @Carol Jones,首先,它看起来代码将从parameters.FilePath 中获取一个文件。那是本地文件还是可访问的网址?另外,为什么脚本是 'ActivityName....' ?或者你定义了一个与Activity同名的命令?最后,我建议添加 try catch 以在日志中转储一些错误消息,这可能会有所帮助。如果这些都没有帮助,请隔离并共享一个测试数据集,包括 .NET 代码项目和设计自动化脚本。如果其中包含机密信息,请发送电子邮件至 forge.help@autodesk.com。 【参考方案1】:

我终于让它在本地 AutoCAD 中与 HostApplicationServices.getRemoteFile 一起工作,然后将其迁移到 Design Automation。它现在也在工作。下面是.NET插件的命令。

为了进行简单的测试,我在插件中硬编码了 URL。您可以将 URL 替换为您身边的工作流(通过 json 文件或 Design Automation 的输入参数)

我的演示 ReadDWG 从远程 URL 文件中读取实体,然后将实体 wblock 到当前图形(HostDWG),最后保存当前图形。

希望它有助于解决您身边的问题。

.NET 命令

namespace PackageNetPlugin
   
    class DumpDwgHostApp: HostApplicationServices
    
        public override string FindFile(string fileName, 
                                    Database database,
                                     FindFileHint hint)
        
            throw new NotImplementedException();
        

        public override string GetRemoteFile(Uri url, 
                                             bool ignoreCache)
        
             //return base.GetRemoteFile(url, ignoreCache);

             Database db = 
             Autodesk.AutoCAD.ApplicationServices.Application.
                        DocumentManager.MdiActiveDocument.Database;

             string localPath = string.Empty; 
             if (ignoreCache)
             
                 localPath = 
                    Autodesk.AutoCAD.ApplicationServices.Application.
                         GetSystemVariable("STARTINFOLDER") as string; 

                string filename = 
                    System.IO.Path.GetFileName(url.LocalPath);
                 localPath += filename;
                using (var client = new WebClient())
                
                    client.DownloadFile(url, localPath);
                 
              

            return localPath;
        

        public override bool IsUrl(string filePath)
       
            Uri uriResult;
            bool result = Uri.TryCreate(filePath, 
                          UriKind.Absolute, out uriResult)
                     && (uriResult.Scheme == Uri.UriSchemeHttp || 
                         uriResult.Scheme == Uri.UriSchemeHttps);

            return result;
         
 

public class Class1
  
    [CommandMethod("MyPluginCommand")]
    public void MyPluginCommand()
    
        try  
            string drawingPath = 
  @"https://s3-us-west-2.amazonaws.com/xiaodong-test-da/remoteurl.dwg";

            DumpDwgHostApp oDDA = new DumpDwgHostApp();
            string localFileStr = "";
            if (oDDA.IsUrl(drawingPath)) 
                localFileStr = oDDA.GetRemoteFile(
                   new Uri(drawingPath), true);

            

            if(!string.IsNullOrEmpty(localFileStr))
            
                //source drawing from drawingPath
                Database source_db = new Database(false, true);
                source_db.ReadDwgFile(localFileStr, 
                      FileOpenMode.OpenTryForReadShare, false, null); 

                ObjectIdCollection sourceIds =
                           new ObjectIdCollection();
                using (Transaction tr = 
                    source_db.TransactionManager.StartTransaction())
                
                    BlockTableRecord btr = 
                       (BlockTableRecord)tr.GetObject(
                SymbolUtilityServices.GetBlockModelSpaceId(source_db), 
                                                    OpenMode.ForRead);
                    foreach (ObjectId id in btr)
                    
                        sourceIds.Add(id);
                    
                    tr.Commit();
                

                //current drawing (main drawing working with workitem)
                Document current_doc =
                 Autodesk.AutoCAD.ApplicationServices.Application.
                         DocumentManager.MdiActiveDocument;
                Database current_db = current_doc.Database;  
                Editor ed = current_doc.Editor;   

                //copy the objects in source db to current db
                using (Transaction tr = 
                    current_doc.TransactionManager.StartTransaction())
                
                    IdMapping mapping = new IdMapping();
                    source_db.WblockCloneObjects(sourceIds, 
        SymbolUtilityServices.GetBlockModelSpaceId(current_db), 
        mapping, DuplicateRecordCloning.Replace, false);
                    tr.Commit();
                

            

        
        catch(Autodesk.AutoCAD.Runtime.Exception ex)
        
            Autodesk.AutoCAD.ApplicationServices.Application.
DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
         

     
  

【讨论】:

哇!!非常感谢! @CarolJones,我很抱歉!我们的工程师团队提醒我,在 AutoCAD 设计自动化中直接调用 HTTP 请求(如 WebClient.Download)不是受支持的方式。我的代码演示恰好可以工作:( 方法应该是在 CRX 插件中使用可变参数输入并调用 acesHttpOperation,但我还没有制作可以通过这种方式下载远程 DWG 的工作代码。一旦有任何我会回复你进展。

以上是关于欧特克设计自动化的主要内容,如果未能解决你的问题,请参考以下文章

json 欧特克锻

从存储桶中删除文件。欧特克锻造

|欧特克锻造 |将 RVT 导出到多个 3D 视图中

|欧特克锻造 |将 RVT 导出到 NWF、NWD、NWC

C#程序对AutoCAD二次开发

cad使用心得体会