雪山飞狐_lzh
发表于 2010-12-22 13:13:03
本帖最后由 lzh741206 于 2010-12-22 13:16 编辑
还是把代码贴上吧,简单的注释了下
注意先引用我的TlsBasal.dll(重贴了一次)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75701&page=1&extra=#pid403883
public static void tttt()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
//获取直线选集
SelectionFilter sf = new ResultTree{ { 0, "line" } };
var resSel = ed.GetSelection(sf);
using (var tr = new DBTransaction())
{
//遍历选择集,按方向将直线分组
var dict = new Dictionary<LineSegment3d, List<Line>>();
foreach (Line line in resSel.Value.GetEntitys<Line>(tr))
{
//转换DBLine为GeLineSegment3d
bool flag = false;
LineSegment3d ls = line.ToCurve3d();
//遍历分组字典
foreach (var lls in dict)
{
//如果共线,加入当前组
if (lls.Key.IsColinearTo(ls))
{
flag = true;
lls.Value.Add(line);
break;
}
}
//如果没有找到,新建一个组
if (!flag)
dict.Add(ls, new List<Line> { line });
}
//遍历分组字典
foreach (var lls in dict)
{
var lines = lls.Value;
if (lines.Count > 1)
{
//将直线的起点终点放入同一集合
var pts = new List<Point3d>();
foreach (var line in lines)
{
pts.Add(line.StartPoint);
pts.Add(line.EndPoint);
}
//按XYZ排序方式找到最小点和最大点
var ptarr = pts.FindByExt(GeometryEx.CompareTo);
//删除原直线,并生成新的
tr.Erase(lines);
var btr = tr.OpenCurrentSpace();
tr.AddEntity(btr, new Line(ptarr, ptarr));
}
}
}
}
sieben
发表于 2010-12-22 15:32:32
1,这是哪个版本的代码?var 类型真给力
2,if (lls.Key.IsColinearTo(ls)) 这个没有公差
3,var ptarr = pts.FindByExt(GeometryEx.CompareTo); 这个没见过
4,tr.AddEntity(btr, new Line(ptarr, ptarr)); 把其中一条直线延伸到这两点怎么样?
雪山飞狐_lzh
发表于 2010-12-22 15:41:16
本帖最后由 lzh741206 于 2010-12-22 15:45 编辑
1、var -> VS2008
2、IsColinearTo没有公差 -> 使用默认公差
3、pts.FindByExt(GeometryEx.CompareTo); -> TlsBasal.dll自带扩展
4、可以,不过删除,添加代码要简单些:)
先引用TlsBasal.dll,在代码中加入下列
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using TlsCad.Collections;
using TlsCad.ExtendMethods;
using TlsCad.MTextTranslation;
using TlsCad.Runtime;
using TlsCad.Trans;
chpmould
发表于 2010-12-22 19:12:58
请问老师我已引用你提供TlsBasal.dll类,但在调试中以下两句通不过,请帮看一下我错在那里 //按XYZ排序方式找到最小点和最大点
var ptarr = pts.FindByExt(GeometryEx.CompareTo);
//删除原直线,并生成新的
tr.Erase(lines);
chpmould
发表于 2010-12-22 19:14:19
以下是调试中提示
雪山飞狐_lzh
发表于 2010-12-22 23:34:40
本帖最后由 lzh741206 于 2010-12-22 23:53 编辑
看11楼(2012/12/22)
雪山飞狐_lzh
发表于 2010-12-23 13:01:11
在链接的帖子里我重新上传了更新版,你要再下载一次
chpmould
发表于 2010-12-23 19:22:56
本帖最后由 chpmould 于 2010-12-23 19:25 编辑
老师我重新下载了,但以下两句中红色函数调不通。。。如果可以将此功能单独写出来,不用调用TlsBasal.dll类的那就更便于学习了。。。
//按XYZ排序方式找到最小点和最大点
var ptarr = pts.FindByExt(GeometryEx.CompareTo);
//删除原直线,并生成新的
tr.Erase(lines);
sxpd
发表于 2010-12-26 22:49:36
你的基础太薄弱了,闭关修行一段时间吧
chpmould
发表于 2010-12-27 12:30:00
谢谢提示,后期我将多点时间消化一些基础的东西。。。