Hart 发表于 2002-8-8 10:59:00

[求助]如何用VBA进行求值-->mccad转移

这个程序是通过一个文本文件进行绘图的,首先根据预设值的个数赋值给A,B...,然后通过对变量的运算得出数据,文件中以“;”做为注释信息的开始。用VBA如何才能编出计算绘图数据的程序呢?

(文本文件如下:)
-----------------------------------------------------------
per = 121.2,909,303,303,30.3,15.15,90.9,60.6 ;预设值(A~L)
*PLDATA      ;绘图数据开始
B, 0, 0, 0      ;基点( B, x, y )
L, 0, C-H+G, 0
L, B-D-G, 0, 0
A, G, -G, 0.41
L, D, 0, 0    ;( L or A ), x, y
L, 0, -(C-H), 0
C, 0   ;( C, 结束 )
*PLDATA-END    ;绘图数据结束
-----------------------------------------------------------

Hart 发表于 2002-8-13 14:01:00

哪位大侠,帮帮忙吧!

哪位大侠,帮帮忙吧!

leeyeafu 发表于 2002-8-13 14:21:00

先解释一下文本文件的内容是什么意思

Hart 发表于 2002-8-14 10:20:00

文本意思如下

文本意思如下:
Per定义变量的初值,如A=121.2,B=909以此类推。
*PLDATA是绘图数据开始的标志,以*PLDATA-END做为绘图数据结束标志。
B,0,0,0 是指绘图的基点,也是起点。
L,0,C-H+G,0 指画一条直线,直的起点是上一绘图的终点,直线的终点是0,333.3,0(对变量进行计算后的结果),以A开指画的是弧形,第三个数据是指它的凸度。
C,0 是指封闭图形,因为整个图形做出来的结果是一个封闭的多义线。
我所碰到的难题是它里面还包含有说明数据,怎样才能在读数据时过滤掉注释信息,并能计算变量的值(如C-H+G的值)?

leeyeafu 发表于 2002-8-14 16:04:00

你的问题不难,但很麻烦

用VB/VBA读ASCII文本文件,只能将文件每行作为一个字符串处理,首先,文本第一行要处理逗号(,),以便给变量赋值。和分号(;)的处理一样,要逐字符读出并判断,将分号(;)后的注释忽略。计算表达式的处理要用到数据结构知识,不过也可以试试将表达式直接送到ACAD命令行,由ACAD处理,只是要注意变量命令要与文本一致,同时,ACAD对空格敏感,要避免将多余的空格送到ACAD命令行。

Hart 发表于 2002-8-15 11:13:00

还有谁能帮忙?

第一行给变量赋值我已实现,就是接下来的变更计算有困难,我如果先把;及以后的注释信息去除,那截去后的数值类型也就变成字符型了,也就不能进行运算了.送到CAD命令行怎么处理数值呢?我怎么处理图形成封闭多义线呢?所以最关键的就是怎样在VBA中过滤注释信息并对变量进行运算,然后利用VBA画出图形.

leeyeafu 发表于 2002-8-15 15:57:00

如果实在没办法,就这样试试

本帖最后由 作者 于 2002-8-15 15:57:14 编辑

用VB的open语句将文本文件打开后,VB有三种方法从文件中输入数据:
1、Input #filenum,vialist语句,这是你给变量赋值用的方法。
2、Input(number,#filenum)函数,一次从文件中读出number个字符并返回。
3、Line Input #filenum,strTxt语句,一次从文件读出一行并赋予strTxt。
根据你所说的文本文件的语法,这三种方法要灵活运用,都用得上。
例如:用方法1变量赋值后,用方法3读出注释并忽略掉。
运算表达式的处理要麻烦些,用方法1读出有用的数据,并以字符串的格式赋值给变量,再判断:若是数字(IsNumeric函数)就直接用,否则,去掉多余的空格(用Trim函数)后,在ACAD中激活'cal(计算器)透明命令,并将表达式发送到ACAD命令行。
方法2是无奈的选择,但方法1和方法3都是通过这样实现的。

Hart 发表于 2002-8-16 08:31:00

感谢leeyeafu

其实如果只要把注释去掉是比较简单的,先生成一个去除注释的函数,读入一整行,然后调用函数,这样得出的数据就不包含注释了,再用字符定位找出豆号(,)的位置进行截取.再把截出的数据赋给变量就行了,只是这样变量的类型是字符型的,不能进行数值运算(如"A+B+C"),好像也没什么函数能进行转换计算.
不管怎样,还是非常感谢leeyeafu,我是一个初学者,希望咱们能成为朋友,以后有问题能共同研究.我的Email:yishu1@163.com.

leeyeafu 发表于 2002-8-16 10:32:00

是的,没什么函数能进行转换计算

字符串若是数据(IsNumeric函数返回True),可用Val()函数取出数据。
若是表达式,VB/VBA不能直接处理,在我的印象中,常见的高级语言没见提供这种转换的函数。
不过这种转换是可以实现的,各种高级语言的编译就要用到大量的字符串与表达式之间的转换。这种算法实际上是计算机专业领域的基础算法,建议你自学计算机专业的《编译原理》和《数据结构》课程。如果不需要深入了解,或只要解决不太复杂的表达式转换,可以看看《数据结构》教材中有关《二叉树》的章节,其中的例题或习题应该有关于表达式的算法表示。
完全由自己写这种表达式转换函数,是一种费时费精力的工作,要处理括号,运算优先级等许多问题。我只能等闲下来才可能帮你。Sorry:(
不过也许可以试试将这种转换交给ACAD处理,你先试试在ACAD命令行透明地使用'Cal命令,找到将表达式传递到ACAD命令行的方法。下面给你几个在ACAD命令行使用cal命令可能用到的LISP语句格式:
赋值:(setq a 123.456);相当于VB的 a=123.456
点坐标表示:'(a b) 或 list(a b c);第一个参数为点的X坐标
          ;后两个参数为Y、Z坐标,Z坐标可省略

Hart 发表于 2002-8-16 14:17:00

也会有问题的

其实Lisp我也会一点,(我是先学Lisp再学VBA的),也用Lisp来编过这个程序,读数据和赋值也都没问题,问题也是出在数据运算中,我也想过用CAL来计算,但有个问题是,调用CAD命令.
    第一次调用CAL命令(用C:CAL)不能带参数,不带参数它又不能自动退出.只要调用过一次CAL命令就能正常运用,但我编出来的程序总不能要别人用时都先调用一次CAL吧.
页: [1] 2
查看完整版本: [求助]如何用VBA进行求值-->mccad转移