惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Cisco Talos Blog
Cisco Talos Blog
C
Check Point Blog
博客园_首页
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Martin Fowler
Martin Fowler
Recorded Future
Recorded Future
S
Security @ Cisco Blogs
L
LINUX DO - 最新话题
博客园 - 司徒正美
P
Privacy International News Feed
G
Google Developers Blog
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Scott Helme
Scott Helme
K
Kaspersky official blog
I
InfoQ
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Webroot Blog
Webroot Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
D
Docker
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Microsoft Azure Blog
Microsoft Azure Blog
Spread Privacy
Spread Privacy
量子位
H
Hacker News: Front Page
Simon Willison's Weblog
Simon Willison's Weblog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
SecWiki News
SecWiki News
S
Security Affairs
Latest news
Latest news
人人都是产品经理
人人都是产品经理
C
CERT Recently Published Vulnerability Notes
S
Security Archives - TechRepublic
V
Visual Studio Blog
T
Troy Hunt's Blog
S
Secure Thoughts
F
Fortinet All Blogs
V
V2EX
The Register - Security
The Register - Security
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - 山野村夫

NAS服务器局域网内IPad、手机、电视盒子等联网播放 转:主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Undelete 360 [转]office2010一直卡在“正在受保护的视图中打开” [转]PROE传动链条的装配教程 国家食品药品监督管理局 前有27家网站有资格向个人销售非处方药 AutoCAD CAD 多文档标签(AutoDesk公司官方提供下载) [转]XPS转JPG转换器 AutoCAD 中使用“ATTSYNC 命令”更新全部块 [转]读懂美国大使馆发布的空气质量指数 [转]怎样查看局域网内其他机器的网卡物理地址及查询本机的网卡物理地址 ProE中打开、打印工程图时自动退出的解决办法 AutoCAD2007中禁用shift+鼠标中键进行三维旋转 安装清华天河CAD后ProE无法打开系统窗口的问题 PDF页面中的链接在阅读时候不起作用的方法 - 山野村夫 - 博客园 word中编辑公式及公式编号的对齐设置 [原创]让AutoCAD实现宏功能 windows自动更新安装后遗留文件或文件夹的删除 MDS7.5的使用 MHT格式文件更换默认图标及打开后显示乱码的问题
Pro/ENGINEER实数转字符串的实现方法 - 山野村夫 - 博客园
山野村夫 · 2010-01-12 · via 博客园 - 山野村夫

      在使用Pro/E进行管路系统设计的过程中,为了自动提取管路的参数,需要将用于驱动模型的实数转换为字符串后输出。比如GB 3091-2001《低压流体输送用焊接钢管》中DN20x2.8的钢管,模型厚度的驱动参数为2.8。

   

   

    由于ProE没有直接提供将实型的数据转换为字符串型数据的函数,所以我们需要通过现有的函数来进行组合。根据的方法:B=itos(A)+"."+extract(itos((A-floor(A)+1)*1000),2,3) (A为实数型参数(小数点后有n位)、 B为字符串参数),,可以将实数的整数部分和小数部分分别提取后连接起来即可。这需要用到 itos()、extract()、floor()、String_length()、pow(),下面分别介绍:

1. 基础函数:

    1.1 itos(  )  将整数换成字符串
        用法: Itos(integer) 整数,若为实数则进行四舍五入。
        例:     S1=Itos(123) ==> s1="123"
                 S2=itos(2.8) ==> s2="3"

        注意:如果用户使用参数值为零 (0) 的 itos 函数,则返回值将为空字符串。

    1.2 extract(  )  提取字符串
        用法:extract(string,position,length)
                               |      |        |
                        原字符串  提取位  提取字符数
              position:大于0而小于字符串长度.
              length:  position+length-1 不能大于字符串长度.
       例:   new=extraect("abcded",2,3)==>new="bcd".
             其含义是: 从"abcdef"串的第2个字符(b)开始取出3个字符.

    1.3 floor()  不超过其值的最大整数,用它可指定舍去的小数位.
       用法:  floor(parameter_name or number, number_of_dec_places).
                                               |                         |
                                     参数名或数值          要保留的小数位(可省略)
               number_of_ded_places:它的取值的不同可有不同的结果.
                i)可以为数值亦可为参数,若为实数则取整.
                ii)若number_of_dec_place>8,则不作任何处理,用原值
                  若number_of_dec_place<8,则舍去其后的小数位,则进位

       例如:  floor(-10.2)-->-11       比-10.2小的最大整数为-11.
                floor(10.2)-->10          比10.2小的最大整数为10.
                floor(10.255,1)-->10.2

    1.4 String_length()  计算字符串的字符个数       
       用法: String_length(参数名或字符串)                           
      例: 
                strlen1=string_length("material")   则 strlen1=8
                若material="steel",strlen2=string_length(material),则strlen2=5,字符串要用"  "括起,
      注:     空格亦算一个字符.

    1.5 Pow() 指数函数

      例如:A=pow(10,2)  A=100
              B=pow(100,0.5)  B=10
2. 不小心发现的秘密

    对于ProE中输入的参数,对于实数类型参数中只能显示8位字符(不含小数点.),如下图所示(论输入多少位小数,统总会默认的按照四舍五入的方法取8位;对于关系式,直接取前8位)。这个对小数部分略有影响,我们都按照8位进行取值都能满足精度要求。
     

   

3. 算法实现的过程:假设要提取的参数为a=12.345678(实数类型,共8位字符)

    3.1 取整数部分并转换为字符串: 由于驱动模型的参数均为正数,不考虑负数中负号的影响。所以只需用floor()提取参数的整数部分(不能用itos()

          if itos(floor(a))==""
             整数部分 b="0"
         else
              整数部分 b=itos(floor(a))
         endif

    3.2 取小数部分:

         3.2.1 用String_length()计算整数部分的长度,由此计算小数部分的位数:

                 整数部分的位数 c=String_length(b) 得到 c=2;

         3.2.2 由于整数部分的位数c=2,因此小数部分的位数为:

                 小数部分的位数 d= 8-c 得到 d=6; (实数的总体长度为8)

         3.2.3 将小数部分乘以10的d次方并转换为字符串

                 if a-floor(a) != 0

                     小数部分 e = itos( (a-floor(a))*pow(10,d) )得到e=345678

                 else

                     小数部分 e ="0"

                 endif

                 注意:对于0.0**… 等数值不适合,考虑到零件加工的实际情况,不予考虑。

    3.3 将整数部分和小数部分进行连接

        得到的字符串 string= "整数部分b"+"."+"小数部分e"  得到 string="12.345678",如下图所示:

      

4. 算法的完善

    由于实际的参数很少能够达到8位有效数字,因此上述方法可能会在结尾产生很多零的现象,需要对这些无用的部分进行删除;对于小数位数很多,如0.001(≤0.0*)等高精度的尺寸,考虑到加工中的实际情况,暂时不予考虑(想了半天也没有想出来,希望高手解决)。

    由于proe的函数中没有循环语句,而且也没有if…elseif…语句进行条件判断,所以需要多次用 if…endif 语句重叠使用。我采取从后向前的方向消去尾部的零,单步的算法见下(不考虑≤0.0*等数值的情况,小数点后面只可能有7位有效数字,所以下面的语句只重叠了7)。测试的效果见图片。

    if extract(e,d,1) == "0" & d > 0
      e=extract(e,1,d-1)
      d=d-1
    endif

   

5. 感想

    由于ProE提供的函数非常少,最好的办法是使用高级语言进行二次开发(参考:ProE二次开发作品—定制关系式函数“实数转字符串” ),由于本人不会,所以用了这个笨办法。这个应该是实型数据到字符串型数据的一个基本算法,应该有固定的算法,我们在使用高级语言时候编程环境如VB、C#已经对这个算法进行了分装,没有留意到这个问题,当自己做的时候才发现需要考虑的问题非常多,“书到用时方恨少”真是一点不错。