zoukankan      html  css  js  c++  java
  • Pro/ENGINEER实数转字符串的实现方法

          在使用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#已经对这个算法进行了分装,没有留意到这个问题,当自己做的时候才发现需要考虑的问题非常多,“书到用时方恨少”真是一点不错。

  • 相关阅读:
    VS2008开发的MFC程序,静态连接的方法
    [delphi]参数带有默认值的函数
    __cplusplus的用处
    去掉输入法上的CH和EN
    Linux下Socket的简单使用及最简化封装
    VS2008 _CRT_SECURE_NO_WARNINGS 的问题
    VC:对话框中菜单的使用(WM_INITMENUPOPUP)
    VC:CFindReplaceDialog(非模态对话框、IsWindow()、m_fr、GetFindString())
    献给初学编程者
    VC:状态栏(AfxGetMainWnd()、GetDescendantWindow()、SetPaneInfo()、SetPaneText())
  • 原文地址:https://www.cnblogs.com/ssbpro/p/1644773.html
Copyright © 2011-2022 走看看