乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 107|回复: 8

多段线只适用于数组吗?

[复制链接]

7

主题

16

帖子

2

银币

初来乍到

Rank: 1

铜币
44
发表于 2008-10-7 14:27:01 | 显示全部楼层 |阅读模式
所以我是编程的新手。我在LISP中做过项目,并定制了我的托盘命令份额。但是现在我想花一些时间来了解如何做Autocad能够做的更详细的事情。所以我从简单的任务开始...
我想在绘图中选择一个点。
弹出一个表单,并为我提供三个选项。
上升、运行和上升数量。
然后单击“魔法”
命令按钮。
噗,它将创建一个多段线,看起来像楼梯。
我想这将是一个让我开始的简单项目,它包含所有很棒的元素。我读过许多不同的教程,看过许多不同的例子,并且了解了很多其他项目是如何工作的。所以现在我卡住了。我知道在哪里发表声明。我知道如何添加模块。我知道如何创建表单以及如何将表单的结果显示在模块中。如果一切都公开了,为什么这些值不能从一个模块传递到另一个模块?
所有声明都在本图的页面顶部进行
Dim Bb楼梯As Double
Dim Cb楼梯As Double
Dim R As Intger
Dim X As Double
Dim Y As Double
Dim ptstair As Variant
Dim p As Collection
Dim i As Intger
Public Sub stair()
ptstair=ThisDrawing.Utility.GetPoint(,"Select a point")
MsgBox ptstair(0) & ";" & ptstair(1) & ";" & ptstair(2)
Abstair=ptstair(0)
Bbstair=ptstair(1)
Cbstair=ptstair(2)
MsgBox Abstair&Bbstair&Cbstair
StrOpt.Show
='这是我的form.EndSub
在表单中的选项之后的名称输入并按下魔法按钮...它应该开始这个模块
Public Sub makestair()
MsgBox Ab楼梯 & ";" & Bb楼梯 & ";" & 每次出现这个消息框,值都是空白的。
R=StrOpt.textboxR
X=StrOpt.textboxX
Y=StrOpt.textboxY
'在使用集合之前,您总是必须对集合执行此操作。
设置p=新集合
'我们需要r*2+1点,因为我们先上去;这给我们r水平线
对于i=1到R*2+1
'这一行告诉我们它是奇数还是偶数;i Mod 2=0表示i是即使
'(i除以2得到0的余数)
如果i Mod 2=0,那么
p.Add "(" & Ab楼梯+X*(i-2)/2 & "," & Bb楼梯+Y*i/2 & "," & Cb楼梯 & ")"
其他
p.Add "(" & Ab楼梯+X*(i-1)/2 & "," & Bb楼梯+Y*(i-1)/2 & "," & Cb楼梯 & ")"
结束如果
'这只是将变量输出到电子表格,以便您可以检查它;您可能
'将无法在AutoCAD
'这是循环的结尾;它告诉i增加1
下一个i
MsgBox p(1)&p(2)此消息框显示p的值,但它不引用之前选择的点。
我尝试了不同的语法来让addmultiline从集合中查找p的值并将它们用于应该包含在多段线中的点。我在想这个庄园中只能使用数组来进行多段线。但不确定。
结束子
如果有更好的方法来做到这一点,我愿意接受新的方向。这是对我最有意义的一个。我遇到了这么多路障,这变得越来越明显,以至于我有这么多的家庭作业要做。然后也许有一天我会变得足够熟悉,可以继续acad.net.那太好了。
谢谢大家。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2008-10-7 14:55:10 | 显示全部楼层
首先...欢迎来到沼泽。
其次...它对我有用。
我唯一要更改的是DIM到PUBLIC,因为您希望将这些变量提供给其他模块。
现有代码...
更改的代码...
哦,我总是使用Option Explute,这意味着必须声明所有变量。
回复

使用道具 举报

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-10-7 16:10:05 | 显示全部楼层
我*喜欢*做的一件事是将我的公共变量移动到一个代码模块(从技术上讲,这个绘图是一个类模块)
顺便说一句,对于一个“新人”来说,这是一些漂亮的代码……欢迎!
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2008-10-7 16:12:49 | 显示全部楼层

这里也是一样……想想看……我不记得这幅画里最后一次有代码是什么时候了(除了一个早已消失的旧ACAD.dvb文件)。
回复

使用道具 举报

4

主题

54

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-10-7 17:42:49 | 显示全部楼层

我认为你是对的。 方法需要一个数组。  VBA 帮助不是太糟糕,应该有示例。 数组需要声明为双精度(实数)。 看起来您的集合是字符串的集合(其中带有数字的文本字符串恰好看起来非常随意)。  你已经有了一个非常好的开始,让它的大部分工作都很好!
回复

使用道具 举报

7

主题

16

帖子

2

银币

初来乍到

Rank: 1

铜币
44
发表于 2008-10-8 10:20:49 | 显示全部楼层
感谢大家的411。我会让您了解最新的最终代码。
回复

使用道具 举报

7

主题

16

帖子

2

银币

初来乍到

Rank: 1

铜币
44
发表于 2008-10-8 16:06:34 | 显示全部楼层
到目前为止,一切都很顺利。有人可以指出我的逻辑在哪里是错误的,或者我的语法在哪里变坏了。
  1. Option Explicit
  2. Dim pt As Variant
  3. Public Ab0 As Double
  4. Public Bb0 As Double
  5. Public Cb0 As Double
  6. Public abc As Double
  7. Public R As Integer
  8. Public X As Double
  9. Public Y As Double
  10. Dim ptstair As Variant
  11. Dim p As Variant
  12. Dim i As Integer
  13. Dim RR
  14. Dim PLP(0 To 2) As Double
  15. Dim plpoints
  16. Dim plp00 As Double
  17. Dim plp01 As Double
  18. Dim plp02 As Double
  19. Public Sub SelPoint()
  20.       pt = ThisDrawing.Utility.GetPoint(, "Select Point:")
  21. MsgBox pt(0) & ";" & pt(1) & ";" & pt(2)
  22.              Ab0 = pt(0)
  23.              Bb0 = pt(1)
  24.              Cb0 = pt(2)
  25. StrOpt.Show                 'this calls the form StrOpt. Where I input the values for the rise, run, and number of risers.
  26. End Sub
  27. Public Sub makestair()
  28. R = StrOpt.textboxR        'This is the number of risers
  29. X = StrOpt.textboxX        'This is the Run of the riser
  30. Y = StrOpt.textboxY        'This is the Rise of the riser
  31. RR = (R * 2) + 1              ' This is the number of times the step needs to repeat. 4 Risers will require
  32.                                     '9 points in the polyline
  33.                                         ' You always have to do this with a collection before you can use it.
  34.     Set p = New Collection
  35.    
  36.                                           ' i is equal to integers 1 thru RR,(number of points needed for polyline)
  37.     For i = 1 To RR Step 1
  38.         If i Mod 2 = 0 Then         'if i divided by 2 has a remainder of 0, an even number, then I would
  39.                                            'like for the following formula.
  40.             plp00 = Ab0 + X * ((i - 2) / 2)
  41.             plp01 = Bb0 + Y * (i / 2)
  42.             plp02 = Cb0
  43.             MsgBox plp00 & plp01 & plp02
  44.             
  45.             PLP(0) = plp00: PLP(1) = plp01: PLP(2) = plp02     ' here is where I would like to take the three values and
  46.                                                                                 'and turn them back into a variant that will be used in the
  47.                                                                                 ' add polyline command.
  48.             p.Add (PLP())
  49.             
  50.         Else                    'if i divided by 2 has  a remainder not equal to 0, odd number, then I
  51.                                 'would like the following formula.
  52.             plp00 = Ab0 + X * ((i - 1) / 2)
  53.             plp01 = Bb0 + Y * ((i - 1) / 2)
  54.             plp02 = Cb0
  55.             MsgBox plp00 & plp01 & plp02
  56.             
  57.             PLP(0) = plp00: PLP(1) = plp01: PLP(2) = plp02
  58.             p.Add (PLP())
  59.         End If
  60.     Next i
  61.                                         ' now I should have a collection of items that are variants.  
  62. plpoints = p.Item(PLP(4))            
  63. MsgBox plpoints
  64. End Sub

我知道我可以得到一个点并提取三个变体。我该怎么做才能反其道而行之。使用三个数字并使其成为单个变量的变体?
谢谢大家
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-10-8 17:29:11 | 显示全部楼层
我在这里没有太多时间,但您知道在运行时有多少点。
dim ts()
dim汇总为整数
汇总=x
重新设置(汇总-1)
现在在您的循环中
ts(i*3)=: ts(i*3+1)=etc
我只会使用lwplines,因此数学与重的不同
回复

使用道具 举报

4

主题

54

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2008-10-8 18:08:47 | 显示全部楼层
Bryco的建议看起来不错。 我会摆脱集合,只使用一个redim点数组。 这令人困惑,因为 AddPolyline 方法实际上并不使用点 - 它使用包含 xyzxyz 值的数组。 对于重折线,pts 应该是
redim pts(RR*3-1) 作为双精度
值,其中 RR 是折线中的顶点数。 您的数组最终应包含(对于 9 个顶点)
pts(0) = x1
pts(1) = y1
pts(2) = z1
pts(3) = x2
pts(4) = y2
pts(5) = z2
...
pts(24) = x9
pts(25) = y9
pts(26) = z9
所以在你的循环中 i = 1 到 RR,其中你有
PLP(0) = plp00: PLP(1) = plp01: PLP(2) = plp02
你可以改变 (或 add)
pts((i-1)*3) = plp00: pts((i-1)*3+1) = plp01: pts((i-1)*3+2) = plp02
由于你的 z 总是一样的, 你可以考虑使用轻量级的折线 - 它们使用更少的空间。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 01:49 , Processed in 1.143807 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表