乐筑天下

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

自動算出鞋圖樣板的個數程序

[复制链接]

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-8-5 10:22:00 | 显示全部楼层 |阅读模式
下程序自动地测出我设计鞋样片的个数,



xcgrc4y030r.jpg

xcgrc4y030r.jpg



[Power=1]
; 制鞋专用   测试样板片的个数
; 源码来自Meflying大侠, BDYCAD在应用中,
; 时间 : 2004-08-05
(defun c:test (/ ss select-spline-g)
  (setq ss (ssget "X" '((0 . "SPLINE") (8 . "0")))); 取得所有0层的spline曲线
  (setq select-spline-g (Get_Selection_List ss)); 调用子程序把组成鞋样板片图的曲线分为一个选集组一个选集组
  (princ (strcat "\n报告BDYCAD, 你当前的文件样板版的个数为" (rtos (length select-spline-g)) "个, 如有凝问请自行查正."))
  (princ))
(defun HasInters (ent_1 ent_2 / ax_ent_1 ax_ent_2 intpoints)
  (setq ax_ent_1 (vlax-ename->vla-object ent_1)
        ax_ent_2 (vlax-ename->vla-object ent_2)
  )
  (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendboth))
  (setq intpoints (vlax-variant-value intpoints))
  (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
    t
    nil
  )
)
(defun Get_Inters_Name(ename ss / n i ename2 rname)
  (setq i 0)
  (setq n (sslength ss))
  (while ( n 0)
    (setq Ename1 (ssname ss 0))
    (ssdel Ename1 ss)
    (setq ss_New (ssadd))
    (ssadd Ename1 ss_New)
    (while (setq Ename2 (Get_Inters_Name Ename1 ss))
      (ssadd Ename2 ss_New)
      (ssdel Ename2 ss)
      (setq Ename1 Ename2)
    )
    (setq Ename_List (append Ename_List (list ss_New)))
    (setq ss_New nil)
    (setq n (sslength ss))
  )))
  (princ)
  Ename_List
)
[/Power]

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

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

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-8-5 10:29:00 | 显示全部楼层
但是如果在样板片我开了孔程序就多计出来了如下图所示, 在这里我想请教Mefyling 版主和龙龙版主和各位朋友. 如何解决这样的情况呢? 因为我这里制鞋用的都是spline哦. 还望各位朋友在百忙中抽个时间给我指点一二. 谢谢!!!
        
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:xhbmqd2kiqw.dwg 
下载次数:0  文件大小:210.46 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]


qkk3oovnoji.jpg

qkk3oovnoji.jpg

回复

使用道具 举报

124

主题

837

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1333
发表于 2004-8-5 20:49:00 | 显示全部楼层
你的图是Group形式,考虑组字典是否会好处理些, 今天写了个vba的程序,有些牵强:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:iolfhxovomm.rar 
下载次数:0  文件大小:1.36 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]



'就你的dwg文件而言,你需要得到的鞋样板片都是以组Group形式存在的.
'而开孔实体没有,仍然是Spline.
'所以这个程序只对这两张图. 如果开孔实体也是在Group中,就要再想别的方法了!
Sub Test()
                         Dim ssetObj As AcadSelectionSet
                         Dim SSetColl As AcadSelectionSets
                         Set SSetColl = ThisDrawing.SelectionSets
                         Set ssetObj = CreateSSet("TEST2")
                         Dim mode As Integer
                         
                         mode = acSelectionSetAll
                         Dim gpCode(0) As Integer
                         Dim dataValue(0) As Variant
                         gpCode(0) = 0
                         dataValue(0) = "SPLINE"
                         
                         Dim groupCode As Variant
                         Dim dataCode As Variant
                         groupCode = gpCode
                         dataCode = dataValue
                         
                         ssetObj.Select acSelectionSetAll, , , groupCode, dataCode
                         
                         '取得选择集中所有Spline实体ID
                         Dim ssObj As AcadEntity
                         Dim ind As Integer
                         Dim idlist() As Long
                         ReDim idlist(0)
                         
                         For ind = 0 To ssetObj.Count - 1
                                                         Set ssObj = ssetObj.Item(ind)
                                                         If StrComp(ssObj.ObjectName, "AcDbSpline", 1) = 0 Then
                                                                                         ReDim Preserve idlist(UBound(idlist) + 1)
                                                                                         idlist(UBound(idlist)) = ssObj.ObjectID
                                                         End If
                         Next
                         '''
                         Dim groupsObj         As AcadGroups
                         Set groupsObj = ThisDrawing.Groups
                         Dim groupObj As AcadGroup
                         Dim num As Integer                                         'Group个数计数据器
                         num = 0
                         Dim i, j As Integer
                         
                         For i = 0 To groupsObj.Count - 1
                                                         Set groupObj = groupsObj.Item(i)
                                                         Dim na As String
                                                         na = groupObj.name
                                                         
                                                         Dim Count As Integer
                                                         Count = groupObj.Count
                                                         If Count > 0 Then
                                                                                         Dim grpEnt As AcadEntity
                                                                                         
                                                                                         '检查每一个Group中有无idlist()数组中列出的实体
                                                                                         For j = 0 To Count - 1
                                                                                                                         Set grpEnt = groupObj.Item(j)
                                                                                                                         Dim entName As String
                                                                                                                         entName = grpEnt.ObjectName
                                                                                                                         If StrComp(entName, "AcDbSpline", 0) = 0 Then
                                                                                                                                                         Dim entId As Long
                                                                                                                                                         entId = grpEnt.ObjectID
                                                                                                                                                         '在idlist中查找有无entId,如果有,我就认为这个Group是一个鞋样(当然不具有普适性)
                                                                                                                                                         Dim il As Integer
                                                                                                                                                         Dim found As Boolean
                                                                                                                                                         found = False
                                                                                                                                                         For il = 1 To UBound(idlist)
                                                                                                                                                                                         If entId = idlist(il) Then
                                                                                                                                                                                                                         found = True
                                                                                                                                                                                                                         Exit For
                                                                                                                                                                                         End If
                                                                                                                                                         Next
                                                                                                                                                         If (found = True) Then
                                                                                                                                                                                         num = num + 1                 '计数器
                                                                                                                                                                                         Exit For
                                                                                                                                                         End If
                                                                                                                         End If
                                                                                         Next '
                                                         End If
                         Next
                         
                         MsgBox num
End Sub
Private Function CreateSSet(ByVal name As String) As AcadSelectionSet
                         On Error GoTo ERR_HANDLER
                         
                         Dim ssetObj As AcadSelectionSet
                         Dim SSetColl As AcadSelectionSets
                         Set SSetColl = ThisDrawing.SelectionSets
                         
                         Dim index As Integer
                         Dim found As Boolean
                         
                         found = False
                         For index = 0 To SSetColl.Count - 1
                                                         Set ssetObj = SSetColl.Item(index)
                                                         If StrComp(ssetObj.name, name, 1) = 0 Then
                                                                                         found = True
                                                                                         Exit For                         'Important.
                                                         End If
                         Next
                         
                         If Not (found) Then
                                                         Set ssetObj = SSetColl.Add(name)
                         Else
                                                         ssetObj.Delete         '
                                                         Set ssetObj = SSetColl.Add(name)
                         End If
                         
                         Set CreateSSet = ssetObj
                         
                         Exit Function
ERR_HANDLER:
                         '-----------------------------------------------
                         ' just print the error the the debug window.
                         Debug.Print "Error in sub CreateSSet: " & Err.Number & " -- "; Err.Description
                         Resume ERR_END
                         
ERR_END:
End Function
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-8-5 21:16:00 | 显示全部楼层
在实际的使用时, 我是把所有的组清去的. 不好意思上传的文件忘记清去组了.王版主我明天再看你的VBA, 我现加班的眼睛痛痛.你晚上也早点休息哦.
回复

使用道具 举报

124

主题

837

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1333
发表于 2004-8-5 21:29:00 | 显示全部楼层
如果不用Group,那这段vba是用不上了,哈哈。
回复

使用道具 举报

57

主题

466

帖子

8

银币

中流砥柱

Rank: 25

铜币
694
发表于 2004-8-5 22:47:00 | 显示全部楼层
王斑竹真是厉害 VBA,ARX,LISP样样都行
为什么不写个 LISP 的上来呢???
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-9-8 09:00:00 | 显示全部楼层
我的问一直没找不到正确的解决方法呢. Meflying 有空帮我看看如何?
回复

使用道具 举报

101

主题

507

帖子

11

银币

中流砥柱

Rank: 25

铜币
910
发表于 2004-9-8 11:34:00 | 显示全部楼层
TO :BDYCAD
我有一个思路,不知是否可行。当得到选择集后,依次判断,用zoom--WPolygon逼近你的鞋底样板的轮廓,如果再轮廓之内选到了选择集内的物体,就在选择集的数量上减1,依次类推。不知可行否?
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-9-9 11:09:00 | 显示全部楼层
就来就是一个样板. 可是程序报出四个了.
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:xp0spq3ghvq.dwg 
下载次数:0  文件大小:48.55 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]


xz2pd0rtxk4.jpg

xz2pd0rtxk4.jpg

回复

使用道具 举报

20

主题

872

帖子

10

银币

中流砥柱

Rank: 25

铜币
952
发表于 2004-9-9 15:03:00 | 显示全部楼层

好的习惯是把内部环另外放一个层,这样直接选外部实体就知道有多少个了。 下面的试试,我写来玩的:)
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:1zeiknwals4.fas 
下载次数:0  文件大小:908 Bytes  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]

回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-19 22:32 , Processed in 2.325078 second(s), 81 queries .

© 2020-2025 乐筑天下

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