乐筑天下

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

[飞马系列] 个人的第一个F# JIG代码——截断线绘制

[复制链接]

130

主题

651

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1172
发表于 2010-8-10 23:51:00 | 显示全部楼层 |阅读模式
个人的第一个F# JIG代码——截断线绘制

由于.NET编程一直似懂非懂,不过最近看了一些F#的介绍之后,对其颇有好感
于是啃了两天帮助
仔细阅读了才鸟兄的C# 五角星jig例子、KEAN的F# 螺旋线jig例子和AUTODESK公司的椭圆C# JIG例子
照葫芦画瓢地写下了如下一段简单的截断线例子
在此对以上作者表示衷心的感谢
而本人水平有限,代码非常不简洁,没有体现出F#的任何优点,各位见笑了,请不吝指教
后续希望能有所改进

源代码和项目如附件,内有说明
使用说明
(1) 可在2007 或2011 中,用netload命令,加载这个myfirstjig.dll
     则可以通过命令 mybl来调用画截断线,效果可见gif文件

w1mbocoi5ya.gif

w1mbocoi5ya.gif



(2)源码使用说明:请用VS2008+F# 2.0安装包或者 VS2010打开
     注意:要修改引用中ACMGD.DLL和ACDBMGD.DLL的路径(重新删除再引用,并设置拷贝到本地为false)
               要修改项目属性中debug里面的acad.exe的路径(重新查找)
by qjchen
  1. //本文参照了才鸟兄的五角星例子、KEAN的螺旋线例子和AUTODESK公司的椭圆JIG例子
  2. //在此对他们表示衷心的感谢
  3. //by qjchen@gmail.com 华南理工大学 2010.08.10
  4. module File1_mod.Commands
  5. //引入一些空间,类似C#的using
  6. open System
  7. open Autodesk.AutoCAD.ApplicationServices
  8. open Autodesk.AutoCAD.DatabaseServices
  9. open Autodesk.AutoCAD.EditorInput
  10. open Autodesk.AutoCAD.Geometry
  11. open Autodesk.AutoCAD.GraphicsInterface
  12. open Autodesk.AutoCAD.Runtime
  13. //根据才鸟兄实体书中的例子编写函数,仿LISP的polar
  14. let PolarPoint (basePt:Point2d) (angle:double) (distance:double):Point2d=
  15.     let point = Point2d(basePt.X+distance*Math.Cos angle,basePt.Y+distance*Math.Sin angle)
  16.     point
  17. //Ang2Rad,仿才鸟兄的函数,不过才鸟兄写成了rad2ang,或许是笔误?
  18. let Ang2Rad (angle:double) =
  19.     let rad=angle*Math.PI/180.0
  20.     rad
  21. //定义一个继承于DrawJig的JdxJig类
  22. type JdxJig() as this = class
  23.   inherit DrawJig()
  24.   //此处定义的两个变量,一个来自于jdx的初始赋值,一个来自于起始点
  25.   let mutable (_pl : Polyline) = null
  26.   let mutable _startPt=new Point3d()
  27.   //member是这个类中的一个函数,仿Kean函数编写
  28.   member x.StartJig(ed:Editor,pt,pl) =
  29.     //将之前获取的点及构造的函数赋予此两变量
  30.     _startPt  endPt then
  31.        //赋予起始点给p0,赋予当前移动点给p6
  32.        let p0:Point2d = new Point2d(_startPt.X, _startPt.Y)
  33.        let p6:Point2d = new Point2d(curPt.X, curPt.Y)
  34.        //计算起始点和终止点的矢量和角度
  35.        let vec:Vector2d = p6-p0
  36.        let ang:double = vec.Angle
  37.        //下面这几段写的真丑陋,没有一点F#简洁的特点,下一步来进行修改
  38.        let mutable p1=new Point2d()
  39.        let mutable p2=new Point2d()
  40.        let mutable p3=new Point2d()
  41.        let mutable p4=new Point2d()
  42.        let mutable p5=new Point2d()
  43.        let mutable p2a=new Point2d()
  44.        let mutable p4a=new Point2d()
  45.        let mutable d06:double = p6.GetDistanceTo(p0)
  46.        //以下是截断线的画法,是按照1:100的比例画的,没有考虑比例问题
  47.        if d06 ignore
  48.     true
  49. end
  50. //下面是函数命令部分
  51. []
  52. let jigjdx() =
  53.   // 开始常用语句
  54.   let doc =
  55.     Application.DocumentManager.MdiActiveDocument
  56.   let ed = doc.Editor
  57.   let db = doc.Database
  58.   // 提示选择起始点
  59.   let startRes = ed.GetPoint("\nSelect first point: ")
  60.   if startRes.Status = PromptStatus.OK then
  61.     let startPt = startRes.Value
  62.     // 创建polyline和运行jig
  63.     let pl:Polyline = new Polyline(7)
  64.     for i=0 to 6 do
  65.         pl.AddVertexAt(i, Point2d(0.0,0.0),0.0,0.0,0.0)
  66.     let jig = new JdxJig()
  67.     let res = jig.StartJig(ed, startPt, pl)
  68.     if res.Status = PromptStatus.OK then
  69.       use tr =
  70.         db.TransactionManager.StartTransaction()
  71.       // 得到块表和块记录
  72.       let bt =
  73.         tr.GetObject
  74.           (db.BlockTableId,OpenMode.ForRead)
  75.           :?> BlockTable
  76.       let ms =
  77.         tr.GetObject
  78.           (bt.[BlockTableRecord.ModelSpace],
  79.           OpenMode.ForWrite)
  80.           :?> BlockTableRecord
  81.       // 把截断线加入到模型空间
  82.       let id = ms.AppendEntity(pl)
  83.       tr.AddNewlyCreatedDBObject(pl, true)
  84.       tr.Commit()

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

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

使用道具 举报

14

主题

44

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2010-8-11 17:52:00 | 显示全部楼层
才鸟兄的C# 五角星jig例子

在哪能看到

F# 不了解
回复

使用道具 举报

130

主题

651

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1172
发表于 2010-8-11 19:39:00 | 显示全部楼层
谢谢 lzh741206版主:)

To bearbear1: 这个例子是来自于我买的一本实体书 《Autocad Vba & Vb.net开发 基础与实例教程》:曾洪飞(网名才鸟),张帆(网名:zfbj),卢择临(ahlzl)几位高手写的书,几位高手也在乐筑天下上啊

不过刚才看了具体章节,讲jig的第22章是ahlzl兄写的,那我前面写的才鸟的写法可能有误.......

F#是函数式语言,有许多优点,我上面的写法是用最啰嗦的方法,无法体现其精髓,等我过些日子更熟悉一些再来改进。

由于这是我用F#编的第二个CAD范例,第一个是画圆啊画线找BOUNGDINGBOX等简单操作,第二个就进入这个JIG的撰写,跳跃有点大。调试的时候开始也出现了几十个错误,改了半天。其实F#对空格、缩进等的要求都挺高,最好还是先用C#或者VB.NET来开发好些。只是做了小小的尝试,希望以后熟悉之后能好些。
回复

使用道具 举报

14

主题

44

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2010-8-14 11:40:00 | 显示全部楼层
  回复的这么清楚,万分激动,

回复

使用道具 举报

14

主题

39

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
96
发表于 2018-3-30 17:19:00 | 显示全部楼层
很好的程序,就是F#看着头大。。。
回复

使用道具 举报

41

主题

320

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
483
发表于 2021-12-10 14:16:00 | 显示全部楼层
我第一个学写的程序也是折断线
是四川德钢建筑工地上打工时自学的
只是没你这中途有动态显示这么高大上
但自我感觉还是实用
你这两端与指定点对齐与实用不太符合
实际中都是超出一小段的最后谢谢您的分享
祝您身体健康

21jlbuyjfd2.jpg

21jlbuyjfd2.jpg
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-21 20:38 , Processed in 0.242747 second(s), 69 queries .

© 2020-2024 乐筑天下

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