明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2352|回复: 8

2007仿2012copy

[复制链接]
发表于 2011-12-10 12:13:34 | 显示全部楼层 |阅读模式
本帖最后由 zlg258369 于 2011-12-10 13:03 编辑


cad2007用的仿2012版的copy


还有我的先选择后执行为什么不好用呢
Dim res As PromptSelectionResult
        Dim sSet As SelectionSet
        Dim opt As New PromptSelectionOptions
        res = ed.SelectImplied()
        If res.Status = PromptStatus.OK Then
            sSet = res.Value
            ids = sSet.GetObjectIds()
        Else
            ' 选择集交互操作
            opt.MessageForAdding = "请选择对象:"
            opt.AllowDuplicates = True
            res = ed.GetSelection(opt)
            If res.Status <> PromptStatus.OK Then Return
            sSet = res.Value
            ids = sSet.GetObjectIds()
        End If

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2011-12-10 13:06:01 | 显示全部楼层
本帖最后由 zlg258369 于 2011-12-10 13:10 编辑

代码在这里

  1. Public Class Jig_CCopy
  2.     ' 从DrawJig类继承.
  3.     Inherits DrawJig
  4.     ' 声明全局变量.
  5.     Dim sourcePt, targetPt, curPt As Point3d
  6.     Dim keyword As String
  7.     Dim i, k, few As Integer
  8.     Dim entCopy(,), entCopy1(), oldEnt() As Entity, ids As ObjectId()
  9.     Dim db As Database = HostApplicationServices.WorkingDatabase
  10.     Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  11.     Dim ed As Editor = doc.Editor

  12.     <CommandMethod("CCopy")> Sub testCCopy()

  13.         keyword = "C"

  14.         Dim res As PromptSelectionResult
  15.         Dim sSet As SelectionSet
  16.         Dim opt As New PromptSelectionOptions

  17.         res = ed.SelectImplied()

  18.         If res.Status = PromptStatus.OK Then

  19.             sSet = res.Value
  20.             ids = sSet.GetObjectIds()

  21.         Else
  22.             ' 选择集交互操作
  23.             opt.MessageForAdding = "请选择对象:"
  24.             opt.AllowDuplicates = True
  25.             res = ed.GetSelection(opt)
  26.             If res.Status <> PromptStatus.OK Then Return
  27.             sSet = res.Value
  28.             ids = sSet.GetObjectIds()

  29.         End If

  30.         ' 得到基点
  31.         Dim optPoint As New PromptPointOptions(vbCrLf & "请输入基点:")
  32.         optPoint.AllowNone = True
  33.         Dim resPoint As PromptPointResult = ed.GetPoint(optPoint)
  34.         If resPoint.Status <> PromptStatus.OK Then Return
  35.         sourcePt = resPoint.Value

  36.         ReDim entCopy1(ids.Length - 1)
  37.         ReDim oldEnt(ids.Length - 1)

  38.         '获取对象
  39.         Using trans As Transaction = db.TransactionManager.StartTransaction()
  40.             For i = 0 To ids.Length - 1
  41.                 oldEnt(i) = trans.GetObject(ids(i), OpenMode.ForWrite)
  42.             Next
  43.             trans.Commit()
  44.         End Using

  45.         Dim lop As Boolean = True
  46.         '循环
  47.         Do While lop = True

  48.             For i = 0 To ids.Length - 1
  49.                 ' 将源对象设置为高亮
  50.                 oldEnt(i).Highlight()
  51.                 ' 复制
  52.                 entCopy1(i) = oldEnt(i).Clone()
  53.             Next
  54.             ' 设置目标点和拖拽临时点
  55.             targetPt = sourcePt
  56.             curPt = targetPt

  57.             ' 开始拖拽.
  58.             Dim jigRes As PromptResult = ed.Drag(Me)
  59.             If jigRes.Status = PromptStatus.OK Then

  60.                 For i = 0 To ids.Length - 1
  61.                     AppendEntity(entCopy1(i))
  62.                 Next

  63.             ElseIf keyword = "A" Then

  64.                 targetPt = sourcePt
  65.                 curPt = targetPt

  66.                 ' 开始拖拽.
  67.                 jigRes = ed.Drag(Me)
  68.                 If jigRes.Status = PromptStatus.OK Then

  69.                     For k = 0 To few - 1
  70.                         For i = 0 To ids.Length - 1
  71.                             AppendEntity(entCopy(k, i))
  72.                         Next
  73.                     Next
  74.                     ' 取消源对象的高亮状态.
  75.                     For i = 0 To ids.Length - 1
  76.                         oldEnt(i).Unhighlight()
  77.                     Next
  78.                     '结束循环
  79.                     lop = False

  80.                 ElseIf keyword = "F" Then

  81.                     targetPt = sourcePt
  82.                     curPt = targetPt

  83.                     ' 开始拖拽.
  84.                     jigRes = ed.Drag(Me)
  85.                     If jigRes.Status = PromptStatus.OK Then

  86.                         For k = 0 To few - 1
  87.                             For i = 0 To ids.Length - 1
  88.                                 AppendEntity(entCopy(k, i))
  89.                             Next
  90.                         Next
  91.                         ' 取消源对象的高亮状态.
  92.                         For i = 0 To ids.Length - 1
  93.                             oldEnt(i).Unhighlight()
  94.                         Next

  95.                         lop = False

  96.                     Else

  97.                         lop = False
  98.                         ' 取消源对象的高亮状态.
  99.                         For i = 0 To ids.Length - 1
  100.                             oldEnt(i).Unhighlight()
  101.                         Next

  102.                     End If

  103.                 Else

  104.                     lop = False
  105.                     ' 取消源对象的高亮状态.
  106.                     For i = 0 To ids.Length - 1
  107.                         oldEnt(i).Unhighlight()
  108.                     Next

  109.                 End If

  110.             Else

  111.                 lop = False
  112.                 ' 取消源对象的高亮状态.
  113.                 For i = 0 To ids.Length - 1
  114.                     oldEnt(i).Unhighlight()
  115.                 Next

  116.             End If

  117.         Loop

  118.     End Sub

  119.     ' Sampler函数用于检测用户的输入.
  120.     Protected Overrides Function Sampler(ByVal prompts As JigPrompts) As SamplerStatus

  121.         If keyword = "C" Then
  122.             Dim optJig As New JigPromptPointOptions(vbCrLf & "请指定第二点[阵列(A)]:")
  123.             ' 设置拖拽光标类型.
  124.             optJig.Cursor = CursorType.RubberBand
  125.             ' 设置拖动光标基点.
  126.             optJig.BasePoint = sourcePt
  127.             optJig.UseBasePoint = True
  128.             '为optJig添加关键字
  129.             optJig.Keywords.Add("A", "A", "A", False, True)
  130.             'optJig.Keywords.Add("C", "C", "C", False, True)
  131.             ''默认关键字
  132.             'optJig.Keywords.Default = "C"
  133.             ' 用AcquirePoint函数得到用户输入的点.
  134.             Dim resJig As PromptPointResult = prompts.AcquirePoint(optJig)
  135.             targetPt = resJig.Value
  136.             ' 如果用户拖拽,则用矩阵变换的方法移动选择集中的全部对象.
  137.             If resJig.Status = PromptStatus.Keyword Then
  138.                 keyword = "A"
  139.                 '获取等分数量
  140.                 Dim optfew As New PromptIntegerOptions(vbCrLf & "请输入等分数量")
  141.                 Dim resfew As PromptIntegerResult = ed.GetInteger(optfew)
  142.                 If resfew.Status <> PromptStatus.OK Then Return True
  143.                 few = resfew.Value

  144.                 ReDim entCopy(0 To few - 1, ids.Length - 1)

  145.                 For k = 0 To few - 1
  146.                     For i = 0 To ids.Length - 1
  147.                         ' 复制.
  148.                         entCopy(k, i) = oldEnt(i).Clone()
  149.                     Next
  150.                 Next
  151.             Else
  152.                 If curPt <> targetPt Then
  153.                     Dim moveMt As Matrix3d = Matrix3d.Displacement(targetPt - curPt)
  154.                     For i = 0 To ids.Length - 1
  155.                         entCopy1(i).TransformBy(moveMt)
  156.                     Next
  157.                     ' 保存当前点.
  158.                     curPt = targetPt
  159.                     Return SamplerStatus.OK
  160.                 Else
  161.                     Return SamplerStatus.NoChange
  162.                 End If
  163.             End If
  164.         ElseIf keyword = "A" Then

  165.             ' 定义一个点拖动交互类.
  166.             Dim optJig As New JigPromptPointOptions(vbCrLf & "请指定第二点[布满(F)]:")
  167.             ' 设置拖拽光标类型.
  168.             optJig.Cursor = CursorType.RubberBand
  169.             ' 设置拖动光标基点.
  170.             optJig.BasePoint = sourcePt
  171.             optJig.UseBasePoint = True
  172.             '为optJig添加关键字
  173.             optJig.Keywords.Add("F", "F", "F", False, True)
  174.             'optJig.Keywords.Add("C", "C", "C", False, True)
  175.             ''默认关键字
  176.             'optJig.Keywords.Default = "C"
  177.             ' 用AcquirePoint函数得到用户输入的点.
  178.             Dim resJig As PromptPointResult = prompts.AcquirePoint(optJig)
  179.             targetPt = resJig.Value
  180.             If resJig.Status = PromptStatus.Keyword Then
  181.                 keyword = "F"
  182.                 For k = 0 To few - 1
  183.                     For i = 0 To ids.Length - 1
  184.                         ' 复制.
  185.                         entCopy(k, i) = oldEnt(i).Clone()
  186.                     Next
  187.                 Next
  188.             Else
  189.                 If curPt <> targetPt Then
  190.                     'Dim moveMt As Matrix3d = Matrix3d.Displacement((targetPt - curPt) / few * (k + 1))
  191.                     For k = 0 To few - 1
  192.                         For i = 0 To ids.Length - 1
  193.                             entCopy(k, i).TransformBy(Matrix3d.Displacement((targetPt - curPt) * (k + 1)))
  194.                         Next
  195.                     Next
  196.                     ' 保存当前点.
  197.                     curPt = targetPt
  198.                     Return SamplerStatus.OK
  199.                 Else
  200.                     Return SamplerStatus.NoChange
  201.                 End If
  202.             End If
  203.         ElseIf keyword = "F" Then

  204.             ' 定义一个点拖动交互类.
  205.             Dim optJig As New JigPromptPointOptions(vbCrLf & "请指定第二点:")
  206.             ' 设置拖拽光标类型.
  207.             optJig.Cursor = CursorType.RubberBand
  208.             ' 设置拖动光标基点.
  209.             optJig.BasePoint = sourcePt
  210.             optJig.UseBasePoint = True

  211.             ' 用AcquirePoint函数得到用户输入的点.
  212.             Dim resJig As PromptPointResult = prompts.AcquirePoint(optJig)
  213.             targetPt = resJig.Value
  214.             ' 如果用户拖拽,则用矩阵变换的方法移动选择集中的全部对象.
  215.             If curPt <> targetPt Then
  216.                 'Dim moveMt As Matrix3d = Matrix3d.Displacement((targetPt - curPt) / few * (k + 1))
  217.                 For k = 0 To few - 1
  218.                     For i = 0 To ids.Length - 1
  219.                         entCopy(k, i).TransformBy(Matrix3d.Displacement((targetPt - curPt) / few * (k + 1)))
  220.                     Next
  221.                 Next
  222.                 ' 保存当前点.
  223.                 curPt = targetPt
  224.                 Return SamplerStatus.OK
  225.             Else
  226.                 Return SamplerStatus.NoChange
  227.             End If

  228.         End If
  229.     End Function
  230. ' WorldDraw函数用于刷新屏幕上显示的图形.
  231.     Protected Overrides Function WorldDraw(ByVal draw As WorldDraw) As Boolean
  232.         If keyword = "C" Then
  233.             For i = 0 To ids.Length - 1
  234.                 ' 刷新画面.
  235.                 draw.Geometry.Draw(entCopy1(i))
  236.             Next
  237.         Else
  238.             For k = 0 To few - 1
  239.                 For i = 0 To ids.Length - 1
  240.                     ' 刷新画面.
  241.                     draw.Geometry.Draw(entCopy(k, i))
  242.                 Next
  243.             Next
  244.         End If
  245.         Return True
  246.     End Function
  247.     ' 将图形对象加入到模型空间的函数.
  248.     Public Shared Function AppendEntity(ByVal ent As Entity) As ObjectId
  249.         ' 得到当前文档图形数据库.
  250.         Dim db As Database = HostApplicationServices.WorkingDatabase
  251.         Dim entId As ObjectId
  252.         Using trans As Transaction = db.TransactionManager.StartTransaction
  253.             ' 以读方式打开块表.
  254.             Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
  255.             ' 以写方式打开模型空间块表记录.
  256.             Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  257.             ' 将图形对象的信息添加到块表记录中,并返回ObjectId对象.
  258.             entId = btr.AppendEntity(ent)
  259.             ' 把图形对象添加到事务处理中.
  260.             trans.AddNewlyCreatedDBObject(ent, True)
  261.             ' 提交事务处理.
  262.             trans.Commit()
  263.         End Using
  264.         Return entId
  265.     End Function
  266. End Class
发表于 2011-12-15 11:18:18 | 显示全部楼层
本帖最后由 s305040093 于 2011-12-15 11:50 编辑

res = ed.SelectImplied() 改为
res = ed.SelectPrevious()
发表于 2011-12-15 11:30:53 | 显示全部楼层
设置了阅读权限,这是在请教问题呢还是在授课?
 楼主| 发表于 2011-12-15 15:39:17 | 显示全部楼层
sieben 发表于 2011-12-15 11:30
设置了阅读权限,这是在请教问题呢还是在授课?

授课什么意思,注册了就看,没注册就不要看,请教问题只不过是顺带,大不了单开一贴再请教,不知道你回的这啥意思。
 楼主| 发表于 2011-12-15 15:42:47 | 显示全部楼层
s305040093 发表于 2011-12-15 11:18
res = ed.SelectImplied() 改为
res = ed.SelectPrevious()

res = ed.SelectPrevious()这个不行地。
发表于 2011-12-15 16:49:35 | 显示全部楼层
zlg258369 发表于 2011-12-15 15:39
授课什么意思,注册了就看,没注册就不要看,请教问题只不过是顺带,大不了单开一贴再请教,不知道你回的 ...

不好意思!我多嘴了,我闭嘴.
发表于 2013-11-4 10:36:28 | 显示全部楼层
为何不能先选择对象后输入命令进行执行呢?请大神位完善。顶起
发表于 2013-11-4 10:43:21 | 显示全部楼层
本帖最后由 xman00 于 2013-11-4 10:45 编辑

且选择A阵列后,未输入选项(即阵列次数时)按ESC取消时,会跳出要求中止的界面(本人验证仅能选择跳过才能继续),这样就很不方便喽,看能否改善一下哇
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 15:33 , Processed in 0.209624 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表