Inventor文件中保存自定义数据 - 3

利用IStorage和IStream存储自定义数据到Inventor文件 (C++) 我去年在全球博客就写了此文章,还有一个姊妹篇(用.NETx竟然没有 阅读详情

前面我们了解了可以通过iProperties或Attribute为文档附加数据。由于Inventor 文件也是一种Windows文件,因此Windows提供的附加数据方法也适用。那就是 IStorage & IStream. 在全球博客上,我已经撰写了专门的文章介绍。不过是用C++写的。
 How to use private storage and stream in C++

后来我琢磨着如何用.NET写。前几个月,正好论坛上有人问起,我就花时间去研究。最后,创建是没问题,可读取却总是失败,见论坛讨论:

http://forums.autodesk.com/t5/Autodesk-Inventor-Customization/Store-object-inside-document/td-p/3610956

百思不得其解。由于忙于DevDays,就暂时放下了。这几天重新翻出来,有请我们开发部的同事Mona帮忙看看。她发现问题出在创建IStorage后,没有释放。于是第二次访问(例如读取)就发生失败了。而C++代码比较幸运,用的是智能指针,自动释放了。这真是太有帮助的发现了!基于此,对代码稍作修改,就运行正常了!再次特别感谢Mona,还有两个网上文章:

 http://www.pinvoke.net/default.aspx/Enums/STGM.html 
http://bytes.com/topic/c-sharp/answers/760093-accessing-com-c-istream-parameter


以下是代码样例,测试可打开一个现有文档,执行test,先是创建数据,添加到文档,接着读取出来。

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Reflection;

using Inventor;

using System.Diagnostics;

using MVOI = Microsoft.VisualStudio.OLE.Interop;

 

        //enum flags for STGM

        [Flags]

        public enum STGM : int

        {

            DIRECT = 0x00000000,

            TRANSACTED = 0x00010000,

            SIMPLE = 0x08000000,

            READ = 0x00000000,

            WRITE = 0x00000001,

            READWRITE = 0x00000002,

            SHARE_DENY_NONE = 0x00000040,

            SHARE_DENY_READ = 0x00000030,

            SHARE_DENY_WRITE = 0x00000020,

            SHARE_EXCLUSIVE = 0x00000010,

            PRIORITY = 0x00040000,

            DELETEONRELEASE = 0x04000000,

            NOSCRATCH = 0x00100000,

            CREATE = 0x00001000,

            CONVERT = 0x00020000,

            FAILIFTHERE = 0x00000000,

            NOSNAPSHOT = 0x00200000,

            DIRECT_SWMR = 0x00400000,

        }

 

        // create private storage and stream

        bool  CreatePrivateStorageAndStream(Document pDoc,

            string StorageName,

            string StreamName,

            string data)

        {

            try

            {

                // create/get storage. "true" means if create 
               //if it does not exists.

                MVOI.IStorage pStg =

                    (MVOI.IStorage)pDoc.GetPrivateStorage 
                                        (StorageName, 
true);

                if (pStg == null)

                    return false;

 

                // create stream in the storage

                MVOI.IStream pStream = null;

                pStg.CreateStream(StreamName, (uint) 
                   (
STGM.DIRECT | STGM.CREATE | 
                  STGM
.READWRITE | STGM.SHARE_EXCLUSIVE),

                    0, 0, out pStream);

 

                if (pStream == null)

                    return false ;

 

                byte[] byteVsize =

                    System.BitConverter.GetBytes 
                                    (data.Length);              

                byte[] byteVData =

                    Encoding.Default.GetBytes(data);

                uint dummy;

 

    // convert string to byte and store it to the stream

                pStream.Write(byteVsize,

                    (uint)(sizeof(int)),

                    out dummy);

                pStream.Write(byteVData,

                    (uint)(byteVData.Length),

                    out dummy);              

 

                // Save the data          

                pStream.Commit((uint) 
                         (MVOI.
STGC.STGC_OVERWRITE |

                          MVOI.STGC.STGC_DEFAULT));

 

          //Don't forget to commit changes also in storage

                pStg.Commit((uint)(MVOI.STGC.STGC_DEFAULT |   
                         MVOI.
STGC.STGC_OVERWRITE));

 

                // force document to be dirty thus

                // the change can be saved when document 
               //is saved.

                pDoc.Dirty = true;               

                pDoc.Save();

 

                //Don't forget to release the object!!

                Marshal.ReleaseComObject(pStg);

 

                return true;

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

                return false;

            }

        }

 

        // read the storge and stream

        bool ReadPrivateStorageAndStream(Document pDoc,

            string StorageName,

            string StreamName,

              out string  outDataStr)

        {

            outDataStr = "";

            try

            {              

                //get the storge. "false" means do not create 
               //if it does not exist

                MVOI.IStorage pStg =

                    (MVOI.IStorage)pDoc.GetPrivateStorage 
                         (StorageName, 
false);

                if (pStg == null)

                    return false;

 

                // open stream to read

                MVOI.IStream pStream = null;

                pStg.OpenStream(StreamName,IntPtr.Zero,

                    (uint)(STGM.DIRECT| STGM.READWRITE | 
                            STGM
.SHARE_EXCLUSIVE),

                    0,  out pStream);

 

                if (pStream == null)

                    return false;

 

                byte[] byteVsize = new byte[16];

                uint intSize = sizeof(int);

 

                // read the stream

                uint dummy;

                pStream.Read(byteVsize,

                    (uint)intSize, out dummy);

                int lSize = System.BitConverter.ToInt16 
                                     (byteVsize,0);

 

                byte[] outDataByte =

                    new byte[8192];

                pStream.Read(outDataByte,

                    (uint)lSize, out dummy);

 

                // convert byte to string

                outDataStr =

                    Encoding.Default.GetString(outDataByte, 
                                               0, lSize);

 

                //Don't forget to release the object!!

                Marshal.ReleaseComObject(pStg);

                return true;  

            }

            catch (Exception ex)

            {

            MessageBox.Show(ex.ToString());               

                return false;

            }

 

        }

 

        // main function to test

        private void test()

        {

            //get Inventor application

            string progId = "Inventor.Application";

            Inventor.Application m_inventorApp =

               (Inventor.Application)Marshal.GetActiveObject 
                                               (progId );

 

            //get the current document.             

            Document pDoc = m_inventorApp.ActiveDocument;

 

            //create the storage and stream

            bool Result  = CreatePrivateStorageAndStream 
                                (pDoc,

                                "MyPrvStorage1",

                                "MyStream1",

                                "Some private stored data");

 

            if (Result)

            {

                pDoc = m_inventorApp.ActiveDocument;

                string outPutStr = null;

                //read the storage and stream

                bool readResult = ReadPrivateStorageAndStream 
                                (pDoc,

                                "MyPrvStorage1",

                                "MyStream1", out outPutStr);

 

                MessageBox.Show(outPutStr);

            }

        }


Inventor SDK入门---环境搭建 Inventor SDK入门---环境搭建,快速建立一个Inventor Addin项目 阅读详情

相关推荐

基于APP Inventor2的蓝牙智能小车控制之APP操作系统篇(20191220更新篇)

1、整体思路 目前基于单片机的智能控制是实现建议操作功能的最直接、最有效的实现方案,这里首先是考虑再蓝牙模式下,实现控制功能,下阶段将进一步延申使用WIFI模式如何实现控制操作。整体以模块化方式实现各项逻辑结构,避免后续程序优化可能存在的修改复杂问题。 2、设计界面 3、使用工具 (1)用户侧操作使用APP(目前主要设计使用了Andrior版本),软件开发工具使...

浅行机器人工作室 8193

App Inventor 2数据存储组件之:微数据库,本地存储数据App下次启动可共享读取

本地一般是数据文件的形式存储在手机上,本地App每次启动都可以共享读取,但是不同的手机之间不可以共享数据;如果需要多个手机之间共享获取或存储数据的话,那就需要用到网络数据库了(云数据库、网络微数据库,它们目前默认都是MIT服务器),它的原理就是用户A将数据通过网络传输到云服务器,然后用户B通过网络可以读取到用户A存储的数据,最典型的应用就是类似微信的聊天App了。经过测试,AI伴侣及编译成最终apk,均能保存我们输入的值到本地,下次启动后能读到上次设置的值。,提供键、值方式的存储。

AppInventor2中文网(https://www.fun123.cn)技术。 2762

app inventor调用陀螺仪加速度计并上传服务器进行后续处理

最近有个现代测试技术课程,需要做一个大作业。我们小组的课题是步态识别,然后分给我的任务是做一个APP来收集IMU数据,正好APP INVENTOR可以很快的实现这一点。 只需要设置一个定时器,以及需要吧数据发送到Tinywebdb服务器才能方便提取进行后续的处理。 其中遇到一个问题,就是发送的二维数组不能过长,数据一开始默认保留17位,哈哈,不需要这么精确,就改成了3位。这样可以记录50Hz,大概20秒的数据。 App有两个界面,首先需要在第一个界面中,输入采样频率和数据标签,均需输入数字,然后点

qq_42001731的博客 937

Inventor文件中保存自定义数据 - 2

第二种方式是Attribute。我们叫做属性,和iPRoperties以示区别。很多Inventor对象都提供了添加属性的功能,包括文档。属性的操作也有大量文章,本文推荐两个材料: 第一是帮助文档。专门有个章节讲解:     另外就是Brian的博客文章。我还没来得及翻译。  http://modthemachine.typepad.com/my_weblog/2009/0

Gear Up Cloud 1851

App Inventor 2 蓝牙串口通信:3步连接Arduino,实现摇杆与按键控制

本文详细介绍了如何使用App Inventor 2通过蓝牙串口通信连接Arduino,实现摇杆与按键控制。通过3个核心步骤,包括开发环境搭建、App Inventor 2应用开发和Arduino端实现,帮助开发者快速构建无线控制系统。文章特别强调了图形化编程的便捷性,适合创客和嵌入式开发爱好者。

weixin_33698823的博客 418

GDCM:gdcm::DefinedTerms的测试程序

GDCM:gdcm::DefinedTerms的测试程序GDCM:gdcm::DefinedTerms的测试程序 GDCM:gdcm::DefinedTerms的测试程序 #include "gdcmDefinedTerms.h" int TestDefinedTerms(int, char *[]) { gdcm::DefinedTerms dt; (void)dt; return 0; }

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1248

Inventor文件中保存自定义数据 - 1

在一些工作流中,需要对文件本身附加一些数据,对最终用户不可见,便于下游的使用。Inventor API提供了三种方式: 1. iProperties  2. Attribute  3. IStorage & IStream 首先最容易的就是iProperties 。这个基本内容有太多文章介绍。我就不赘述了。直接看几段代码,看看如何添加一些数据,并如何取出。为方便不同用户,例子用VB

Gear Up Cloud 2393

Inventor SDK基础教程:实现无文档Ribbon命令按钮

Inventor SDK是Autodesk Inventor软件的软件开发工具包,它允许开发者创建和扩展Inventor的功能。通过SDK提供的API和接口,开发者可以自定义用户界面,增加新的工具和命令,以及实现与Inventor环境集成的外部应用程序。SDK支持多种编程语言,包括但不限于.NET和C++。Ribbon用户界面是一种流行的界面设计,其取代了传统的菜单和工具栏,提供了更为直观和灵活的用户体验。Ribbon界面主要由以下几个部分构成:标签页(Tabs)

weixin_36364707的博客 799

inventor导出tekla_保存和导出文件参考 | Inventor 2019 | Autodesk Knowledge Network

.CATPart、.CATProductCATIA V5 零件和部件文件。(版本 R10 - R19).CATPartCATIA V5 零件。(版本 R10 - R19).x_b、.x_tParasolid 二进制和文本文件。(版本 9.0 - 23.0).g、.neuPro/ENGINEER Granite 和中性文件。(Granite 版本 1.0 - 6.0)BMP光栅图像。DWF二维矢量文...

weixin_29476755的博客 1700

Inventor文件格式详解与应用

本文深入探讨了Inventor文件格式的写入和读取方法,包括如何将场景图保存为ASCII或二进制文件,以及如何将这些文件读入Inventor数据库。详细介绍了文件头部的结构,节点、路径和字段的编写语法,以及如何处理全局字段和引擎。此外,还提供了定义和使用节点共享实例的实例,以及如何编写和读取路径的方法。

weixin_36303807的博客 667

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 425

inventor导出tekla_保存和导出文件参考 | Inventor 2021 | Autodesk Knowledge Network

.CATPart、.CATProductCATIA V5 零件和部件文件。(版本 R10 - R19).CATPartCATIA V5 零件。(版本 R10 - R19).x_b、.x_tParasolid 二进制和文本文件。(版本 9.0 - 23.0).g、.neuPro/ENGINEER Granite 和中性文件。(Granite 版本 1.0 - 6.0)BMP光栅图像。DWF二维矢量文...

weixin_39608301的博客 1889

Zipformer在RK3588上的性能实测:比Conformer快多少?内存省多少?

本文在RK3588平台上对Zipformer和Conformer语音识别模型进行了全面的性能实测。结果显示,Zipformer在模型部署中展现出显著优势:推理速度比Conformer快约56%,峰值内存占用降低约60%,同时在AISHELL-1等测试集上保持了相当的识别准确率。这为边缘ASR应用提供了更高效、更节省资源的解决方案。

metal的博客 482

inventor文件导出其他格式方法

- 写在前面 之前一直以为inventor是款封闭的软件,现在发现还是可以和solidworks、admas等软件相通的。 - 方法一 文件——>另存为——>保存副本为,可看到,在下拉框中可选“parasolid x_t”、“stp,step”,“stl”等多种格式。 - 方法2 文件——>导出——>CAD格式,也可在下拉框中看到多种格式内容。 ...

biter0088的博客 1万+

rk3399 hdmi HDCP key烧录

1.key转换 使用 hdcp\ProvisioningTool_20170526\KeyConverterV2.02 目录下的KeyConvertor.exe工具将1.4key进行转换 转换后得到 TX00000001.skf 文件,将 TX00000001.skf 文件烧录到开发板上,烧录方式: 打开文件 hdcp\ProvisioningTool_20170526\ProvisioningTool20170526\ProvisioningTool.exe 选择烧录方式与烧录路...

qq_32645109的博客 3859

多物理场光学仿真软件:COMSOL_(10).激光器与谐振腔仿真

定义Nd:YAG晶体的材料属性% 折射率% 吸收系数% 发射截面% 定义光泵浦源% 泵浦光波长% 泵浦光强度% 泵浦光方向% 定义全反射镜% 选择边界% 完美电导体边界条件% 定义部分反射镜% 选择边界% 反射率边界条件% 反射率通过 COMSOL 对激光器和光学谐振腔进行仿真,可以全面评估激光器的性能,包括输出功率、效率、稳定性和模式选择等。这些仿真结果为激光器的设计和优化提供了重要的参考依据。

kkchenjj的博客 1649

inventor扫掠不成功_Inventor资源中心

概述温馨提示:文章非常长,请耐心阅读,肯定能让软件使用者受益匪浅! 非标设计中涉及到的资源中心内容,包括型材、紧固件、轴用标准件等等。所以有必要熟悉资源中心的使用与应用。在安装inventor软件的过程中,默认把所有资源中心数据库都安装,也可以自定义安装符合自己标准的一些数据库,且安装路径也可以设置,比如笔者就改了路径,如下图所示。默认资源中心的库位置为这里只讲桌面资源中心,暂不说vault se...

weixin_36087674的博客 2542

PY32F406K1CU6 FLASH模拟EEPROM

摘要:本文介绍了基于STM32 FLASH模拟EEPROM的实现方法。头文件flash.h定义了FLASH页大小(256字节)、用户存储区域(4页)及地址范围,提供了等待周期配置和地址校验宏,声明了EEPROM初始化、读写操作等函数接口。源文件flash.c实现了具体功能:配置FLASH等待周期(144MHz需3WS)、页读写擦除操作,以及EEPROM初始化(解锁-擦除-验证-锁定)和缓冲区读写功能。其中写操作采用"读页→更新→擦除→编程"的流程,确保数据安全写入。该方案适用于需要非易失

sam的博客 194

APP inventor 的BLE低功耗蓝牙控制

appinventor制作BLEapp控制ESP32参考

Miaofufu的博客 2778

个人顶级AI助手OpenClaw(Clawdbot) - 新手快速入门指南

本文详细介绍了个人顶级AI助手OpenClaw(Clawdbot) 的快速入门指南,包括安装部署和使用配置及注意事项

program哲学 5305

VCS NLP 低功耗验证系列(六):功耗分析与优化——SAIF 报告与验证效率提升

本文是VCS NLP低功耗验证系列的第六篇,主要解决功耗数据采集和验证效率优化问题。文章首先介绍了SAIF(Switching Activity Interchange Format)文件在功耗分析中的作用,详细讲解了VCS的Region-Based SAIF功能,包括三个关键系统任务($saif_region_create、$saif_region_exclude、$saif_region_monitor)的使用方法和工程实践建议。接着从编译侧、运行侧和方法学侧三个维度提出了NLP验证效率优化策略,特别强

元直的博客 472

App Inventor 2 图片云端保存及访问的App开发思路

一般来说,类似于购物App,你可以从手机App上传物品图片,然后他人也可以在手机App上查看你上传的物品的照片,这时图片就必须采用云端保存的方式。本文主要就是聊一聊 App Inventor 2 进行图片上传及云端图片访问这种场景的App开发思路,及关键步骤的一些指导。

AppInventor2中文网(https://www.fun123.cn)技术。 1151

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3678

Inventor有没有自动备份方法?

inventor会有个自动备份的旧版本,可能可以退回到一段时间以前。很遗憾,目前inventor没有自动备份设置选项,官网也说没有自动备份方法。虽然有自动储存方法,但是自动储存会覆盖文件,可以会误覆盖。那么想备份咋办?没办法,现阶段软件不完善,提醒自己勤快保存吧。

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 1507

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Inventor 转换为 3DXML 全流程技术指南:附迪威模型网在线方案

本文详细介绍了Autodesk Inventor模型转换为3DXML格式的三种方法:1. 通过STEP中间格式中转,在CATIA中完成转换;2. 使用3DXML Exporter插件直接导出;3. 通过迪威模型网在线转换。重点分析了不同方法的适用场景、操作步骤及关键参数配置,包括轻量化预览与精确设计的模式选择、装配层级保留等。转换3DXML格式可解决跨平台协作、大文件传输、工艺仿真适配等问题,特别适用于汽车、航空等使用达索PLM系统的行业。文章还提供了批量转换脚本和在线转换的实用建议。

技术说明博主 1383

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怎样向hadoop中导入数据_Inventor中导入第三方数据

第2章 导入第三方数据2.1 叙述在这里,我们把inventor以外的三维模型数据称为第三方数据,关于第三方数据的导入,包括直接打开第三方软件格式文件和中性格式文件。如果直接打开第三方软件格式的文件,会涉及到关联文件,比如部件文件会关联到零件,所以被关联的零件不能缺少。如下图的solidworks模型文件,如果只有第一个装配文件,则用inventor软件打开后是个空文件,所以下方那些涉及到的零件文...

weixin_39679678的博客 654

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 操作iPart表的行和列 -2
下一篇: 获知工程图视图来自装配还是零件
autodeskinventorapi
博客等级 码龄14年 313粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值