找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3538|回复: 6

[每日一码] C#开发的批量裁剪

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2016-9-1 11:06:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
  1. // (C) Copyright 2002-2005 by Autodesk, Inc.
  2. //
  3. // Permission to use, copy, modify, and distribute this software in
  4. // object code form for any purpose and without fee is hereby granted,
  5. // provided that the above copyright notice appears in all copies and
  6. // that both that copyright notice and the limited warranty and
  7. // restricted rights notice below appear in all supporting
  8. // documentation.
  9. //
  10. // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
  11. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
  12. // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
  13. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
  14. // UNINTERRUPTED OR ERROR FREE.
  15. //
  16. // Use, duplication, or disclosure by the U.S. ** is subject to
  17. // restrictions set forth in FAR 52.227-19 (Commercial Computer
  18. // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
  19. // (Rights in Technical Data and Computer Software), as applicable.
  20. //


  21. using System;
  22. using System.IO;
  23. using System.Collections;
  24. using System.Collections.Generic;
  25. using System.Text;
  26. using System.Runtime.InteropServices;

  27. using Autodesk.AutoCAD.ApplicationServices;
  28. using Autodesk.AutoCAD.Colors;
  29. using Autodesk.AutoCAD.DatabaseServices;
  30. using Autodesk.AutoCAD.EditorInput;
  31. using Autodesk.AutoCAD.Geometry;
  32. using Autodesk.AutoCAD.GraphicsInterface;
  33. using Autodesk.AutoCAD.LayerManager;
  34. using Autodesk.AutoCAD.Runtime;
  35. using Autodesk.AutoCAD.Windows;


  36. [assembly: CommandClass(typeof(CAIJIAN.Commands))]

  37. namespace CAIJIAN
  38. {
  39.     /// <summary>
  40.     /// Summary description for Commands.
  41.     /// </summary>
  42.     public class Commands
  43.     {
  44.         Editor m_ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  45.         Database m_db = HostApplicationServices.WorkingDatabase;
  46.         public Commands()
  47.         {
  48.             //
  49.             // TODO: Add constructor logic here
  50.             //
  51.         }

  52.         // Define Command "AsdkCmd1"
  53.         [CommandMethod("aaaa")]
  54.      public void test() // This method can have any name
  55.         {
  56.             #region 选择剪切边界实体
  57.             PromptEntityResult m_Per = null;
  58.             if (!m_SelectEntity("选择裁剪实体", "", new Type[] { typeof(Entity) }, ref m_Per)) return;

  59.             Entity m_TrimEdgeEnt = (Entity)m_OpenEntity(m_Per.ObjectId);//剪切边界实体
  60.             Curve m_TrimEdge = m_TrimEdgeEnt as Curve;
  61.             if (m_TrimEdge == null)
  62.                 m_TrimEdge = m_CreateRectangle(m_TrimEdgeEnt.GeometricExtents.MinPoint, m_TrimEdgeEnt.GeometricExtents.MaxPoint, false);
  63.             #endregion

  64.             #region 选择剪切方向
  65.             Point3d m_Pt = new Point3d();
  66.             if (!m_GetPoint("\n剪切方向", ref m_Pt, new Point3d(), false, false)) return;

  67.             Point3d m_Pt1 = m_TrimEdge.GetClosestPointTo(m_Pt, false);//曲线外一点距曲线最近的点
  68.             Vector3d m_Vect = m_TrimEdge.GetFirstDerivative(m_Pt1);//曲线上此点的切向量
  69.             int m_Direct = m_PtSide(m_Pt1.Convert2d(new Plane()), m_Pt1.Add(m_Vect).Convert2d(new Plane()), m_Pt.Convert2d(new Plane()));//裁剪方向
  70.             #endregion

  71.             // AcadApplication m_AcadApp = (AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
  72.             // m_AcadApp.ZoomWindow(m_TrimEdge.GeomExtents.MinPoint.ToArray(), m_TrimEdge.GeomExtents.MaxPoint.ToArray());

  73.             //选择与剪切边包围的所有实体
  74.             PromptSelectionResult m_psr = m_ed.SelectCrossingWindow(m_TrimEdge.GeometricExtents.MinPoint, m_TrimEdge.GeometricExtents.MaxPoint);

  75.             #region 剪切
  76.             int i = 0;
  77.             foreach (ObjectId objid in m_psr.Value.GetObjectIds())
  78.             {
  79.                 if (!objid.Equals(m_Per.ObjectId))
  80.                 {
  81.                     Curve m_Cur = m_OpenEntity(objid) as Curve;
  82.                     if (m_Cur != null)//判断是否曲线实体
  83.                     {
  84.                         if (m_Cur is Polyline2d)
  85.                             m_Cur = m_Polyline2dToLWPolyline(objid);//二维多段线转换为轻量多段线

  86.                         DBObjectCollection m_ObjColl = new DBObjectCollection();
  87.                         if (m_TrimCurve(m_Cur, m_TrimEdge, m_Direct, ref m_ObjColl))
  88.                         {
  89.                             foreach (Entity ent in m_ObjColl) m_CreateEntity(ent);
  90.                             m_EraseEntity(objid);
  91.                         }
  92.                     }
  93.                 }
  94.                 m_ed.WriteMessage("\r正在裁剪...已完成{0}%", ((double)(++i * 100.0 / m_psr.Value.GetObjectIds().GetLength(0))).ToString("0"));
  95.             }
  96.             #endregion

  97.             // m_AcadApp.ZoomPrevious();
  98.         }
  99.         private bool m_TrimCurve(Curve m_Cur, Entity m_TrimEdgeEnt, int m_Direction, ref DBObjectCollection m_ObjColl)
  100.         {
  101.             //m_Cur —被剪曲线;m_TrimEdge  —剪切边界曲线
  102.             //m_Direction —剪切方向,只能是1或-1,1—剪掉边界曲线右边的线,-1—剪左边
  103.             //返回true  —剪切成功,保留的实体保存在m_ObjColl中

  104.             //判断被剪曲线是否位于锁定图层上
  105.             LayerTableRecord m_ltr = (LayerTableRecord)m_OpenEntity(m_Cur.LayerId);
  106.             if (m_ltr.IsLocked) return false;

  107.             if (!(m_TrimEdgeEnt is Curve))//剪切实体不是曲线类,则用其边界框做为剪切边界
  108.                 m_TrimEdgeEnt = m_CreateRectangle(m_TrimEdgeEnt.GeometricExtents.MinPoint, m_TrimEdgeEnt.GeometricExtents.MaxPoint, false);
  109.             Curve m_TrimEdge = m_TrimEdgeEnt as Curve;

  110.             bool m_ReturnFlag = true;
  111.             m_ObjColl = new DBObjectCollection();//初始化为空

  112.             Point3dCollection m_InterPts = m_GetIntersectPoints(m_Cur, (Curve)m_TrimEdge);//求被剪曲线与剪切边的交点
  113.             if (m_InterPts.Count > 0)//判断曲线是否与剪切边相交
  114.             {
  115.                 try
  116.                 {
  117.                     #region 生成交点处拆分的实体集合
  118.                     DBObjectCollection m_Objs = new DBObjectCollection();
  119.                     if (m_Cur is Circle)//判断曲线是否为园
  120.                     {
  121.                         #region 由交点把园拆分为几条圆弧
  122.                         Circle m_cir = m_Cur as Circle;
  123.                         ArrayList m_AngArr = new ArrayList();
  124.                         int n;
  125.                         for (n = 0; n < m_InterPts.Count; n++)
  126.                             m_AngArr.Add(m_InterPts[n].GetVectorTo(m_cir.Center).AngleOnPlane(new Plane()));
  127.                         m_AngArr.Sort();
  128.                         m_AngArr.Add(m_AngArr[0]);

  129.                         for (n = 0; n < m_AngArr.Count - 1; n++)
  130.                             m_Objs.Add(new Arc(m_cir.Center, m_cir.Radius, (double)m_AngArr[n], (double)m_AngArr[n + 1]));
  131.                         #endregion
  132.                     }
  133.                     else
  134.                         m_Objs = m_Cur.GetSplitCurves(m_InterPts);//拆分曲线实体
  135.                     #endregion

  136.                     #region 对拆分实体集合中各实体进行判断,那些需要保留
  137.                     foreach (Curve cur in m_Objs)
  138.                     {
  139.                         ObjectId m_CurId = m_CreateEntity(cur);//先生成实体,主要是三维多段线有问题,EndPoint属性老是错误!!!
  140.                         Curve m_CurNew = m_OpenEntity(m_CurId) as Curve;

  141.                         double m_Param = m_CurNew.StartParam + 0.0001;
  142.                         if (!m_InterPts.Contains(m_CurNew.StartPoint))//点不是交点
  143.                             m_Param = m_CurNew.EndParam - 0.0001;

  144.                         Point3d m_Pt1 = m_CurNew.GetPointAtParameter(m_Param);
  145.                         Point3d m_Pt2 = m_TrimEdge.GetClosestPointTo(m_Pt1, false);
  146.                         Vector3d m_Vect = m_TrimEdge.GetFirstDerivative(m_Pt2);

  147.                         int m_Direct = m_PtSide(m_Pt2.Convert2d(new Plane()), m_Pt2.Add(m_Vect).Convert2d(new Plane()), m_Pt1.Convert2d(new Plane()));
  148.                         if (m_Direct != m_Direction) m_ObjColl.Add((DBObject)m_CurNew.Clone());//保存被剪之后的新实体

  149.                         m_EraseEntity(m_CurId);
  150.                     }
  151.                     #endregion
  152.                 }
  153.                 catch
  154.                 {
  155.                     m_ReturnFlag = false;
  156.                 }
  157.             }
  158.             else
  159.                 m_ReturnFlag = false;

  160.             return m_ReturnFlag;
  161.         }
  162.         #region 公共函数
  163.         //创建实体,把实体加入CAD数据库
  164.         public ObjectId m_CreateEntity(Entity m_entity)
  165.         {
  166.             ObjectId m_objid = new ObjectId();
  167.             if (m_entity != null)
  168.             {
  169.                 using (Application.DocumentManager.MdiActiveDocument.LockDocument())
  170.                 {
  171.                     using (Transaction m_tr = m_db.TransactionManager.StartTransaction())
  172.                     {
  173.                         BlockTableRecord m_btr = (BlockTableRecord)m_tr.GetObject(m_db.CurrentSpaceId, OpenMode.ForWrite, false);
  174.                         m_objid = m_btr.AppendEntity(m_entity);
  175.                         m_tr.AddNewlyCreatedDBObject(m_entity, true);
  176.                         m_tr.Commit();
  177.                     }
  178.                 }
  179.             }
  180.             return m_objid;
  181.         }

  182.         //删除实体
  183.         public void m_EraseEntity(ObjectId m_EntityId)
  184.         {
  185.             using (DocumentLock m_doclock = Application.DocumentManager.MdiActiveDocument.LockDocument())
  186.             {
  187.                 if (!m_EntityId.IsNull && !m_EntityId.IsErased)
  188.                 {
  189.                     Entity m_Ent = m_OpenEntity(m_EntityId) as Entity;
  190.                     LayerTableRecord m_ltr = (LayerTableRecord)m_OpenEntity(m_Ent.LayerId);
  191.                     if (!m_ltr.IsLocked)//实体不在锁定图层上
  192.                     {
  193.                         using (Transaction m_tr = m_db.TransactionManager.StartTransaction())
  194.                         {
  195.                             try
  196.                             {
  197.                                 Entity m_Entity = (Entity)m_tr.GetObject(m_EntityId, OpenMode.ForWrite, false);
  198.                                 if (m_Entity != null) m_Entity.Erase();
  199.                             }
  200.                             catch { }
  201.                             m_tr.Commit();
  202.                         }
  203.                     }
  204.                 }
  205.             }
  206.         }
  207.         public void m_EraseEntity(Entity m_Entity)
  208.         {
  209.             using (DocumentLock m_doclock = Application.DocumentManager.MdiActiveDocument.LockDocument())
  210.             {
  211.                 if (m_Entity != null) m_Entity.Erase();
  212.                 else m_Entity.Dispose();
  213.             }
  214.         }

  215.         //打开实体
  216.         public Object m_OpenEntity(ObjectId m_ObjId)
  217.         {
  218.             Object m_Obj = new Object();
  219.             if (!m_ObjId.IsNull)
  220.             {
  221.                 using (Transaction m_tr = m_db.TransactionManager.StartTransaction())
  222.                 {
  223.                     m_Obj = (Object)m_tr.GetObject(m_ObjId, OpenMode.ForRead);
  224.                     m_tr.Commit();
  225.                 }
  226.             }

  227.             return m_Obj;
  228.         }

  229.         //生成矩形
  230.         public Polyline m_CreateRectangle(Point3d m_Pt1, Point3d m_Pt2, bool m_bLUorLW)
  231.         {
  232.             if (!m_bLUorLW)//不是左上和右下点,而是左下点和右上点
  233.             {
  234.                 Point3d m_Pt3 = m_Pt1, m_Pt4 = m_Pt2;
  235.                 m_Pt1 = new Point3d(m_Pt3.X, m_Pt4.Y, 0);
  236.                 m_Pt2 = new Point3d(m_Pt4.X, m_Pt3.Y, 0);
  237.             }

  238.             Polyline m_lwpline = new Polyline();
  239.             m_lwpline.AddVertexAt(0, m_Pt1.Convert2d(new Plane()), 0, 0, 0);
  240.             m_lwpline.AddVertexAt(1, new Point2d(m_Pt2.X, m_Pt1.Y), 0, 0, 0);
  241.             m_lwpline.AddVertexAt(2, m_Pt2.Convert2d(new Plane()), 0, 0, 0);
  242.             m_lwpline.AddVertexAt(3, new Point2d(m_Pt1.X, m_Pt2.Y), 0, 0, 0);
  243.             m_lwpline.Closed = true;
  244.             return m_lwpline;
  245.         }

  246.         //提示用户输入一点
  247.         public bool m_GetPoint(string m_Msg, ref Point3d m_Pt, Point3d m_BasePoint, bool m_AllowNone, bool m_UseBasePoint)
  248.         {
  249.             if (!m_Pt.Equals(new Point3d())) m_Msg += "<" + m_Pt.X.ToString() + "," + m_Pt.Y.ToString() + "," + m_Pt.Z.ToString() + ">";

  250.             PromptPointOptions m_ppo = new PromptPointOptions("\n" + m_Msg);
  251.             m_ppo.AllowNone = m_AllowNone;
  252.             m_ppo.BasePoint = m_BasePoint;
  253.             m_ppo.UseBasePoint = m_UseBasePoint;

  254.             PromptPointResult m_ppr = m_ed.GetPoint(m_ppo);

  255.             if (m_ppr.Status != PromptStatus.OK)
  256.             {
  257.                 if (m_ppr.Status == PromptStatus.None) { m_Pt = m_BasePoint; return true; }
  258.                 else return false;
  259.             }
  260.             m_Pt = m_ppr.Value;

  261.             return true;
  262.         }

  263.         //提示选择单个实体
  264.         public bool m_SelectEntity(string m_MSG, string m_RejectMSG, Type[] m_EntityType, ref PromptEntityResult m_PER)
  265.         {
  266.             PromptEntityOptions m_peo = new PromptEntityOptions((m_MSG.Substring(0, 2).Equals("\n") ? m_MSG : "\n" + m_MSG));
  267.             m_peo.SetRejectMessage(m_RejectMSG);
  268.             foreach (Type et in m_EntityType) m_peo.AddAllowedClass(et, false);
  269.             m_peo.AllowNone = true;

  270.             m_PER = m_ed.GetEntity(m_peo);
  271.             if (m_PER.Status != PromptStatus.OK) return false;
  272.             else return true;
  273.         }

  274.         //判断点pt在直线pt1->Pt2的哪一侧?返回值:1右侧;0三点共线;-1左侧
  275.         public int m_PtSide(Point2d pt1, Point2d pt2, Point2d pt)
  276.         {
  277.             Vector2d m_vect1 = pt1.GetVectorTo(pt2);
  278.             Vector2d m_vect2 = pt1.GetVectorTo(pt);
  279.             double m_value = m_vect2.X * m_vect1.Y - m_vect1.X * m_vect2.Y;
  280.             if (Math.Abs(m_value) < 0.0000001) return 0;
  281.             else if (m_value > 0) return 1;
  282.             else return -1;
  283.         }

  284.         //求空间两曲线c1与c2在c1上的交点(带标高值)
  285.         public Point3dCollection m_GetIntersectPoints(Curve c1, Curve c2)
  286.         {
  287.             Point3dCollection m_interpts = new Point3dCollection(), m_interpts1 = new Point3dCollection();
  288.             Point3dCollection m_VertexPoints = new Point3dCollection();
  289.             c1.IntersectWith(c2, Intersect.OnBothOperands, new Plane(), m_interpts, 0, 0);//求交点

  290.             if (c1 is Polyline3d && !(c2 is Polyline3d))
  291.             {
  292.                 foreach (Point3d pt in m_interpts)
  293.                 {
  294.                     Polyline3d m_pl3d = new Polyline3d(Poly3dType.SimplePoly,
  295.                         new Point3dCollection(new Point3d[] { pt, pt.Add(new Vector3d(0, 0, 10)) }), false);

  296.                     Point3dCollection m_Pts = new Point3dCollection();
  297.                     c1.IntersectWith(m_pl3d, Intersect.ExtendArgument, new Plane(), m_Pts, 0, 0);
  298.                     foreach (Point3d pt1 in m_Pts) m_interpts1.Add(pt1);
  299.                 }
  300.                 m_interpts = m_interpts1;
  301.             }

  302.             //去掉不正确的交点(IntersectWith求出的交点有可能不正确!!!)
  303.             ArrayList m_DistPtList = new ArrayList();
  304.             foreach (Point3d pt in m_interpts)
  305.             {
  306.                 try
  307.                 {
  308.                     double m_Dist = c1.GetDistAtPoint(pt);//点是否在曲线上?
  309.                     m_DistPoint3d m_DP = new m_DistPoint3d();
  310.                     m_DP.m_dist = m_Dist;
  311.                     m_DP.m_pt = pt;
  312.                     m_DistPtList.Add(m_DP);
  313.                 }
  314.                 catch { }
  315.             }

  316.             m_DistPtList.Sort(new m_DistPtsSort());//排序
  317.             m_interpts1 = new Point3dCollection();
  318.             foreach (m_DistPoint3d dp in m_DistPtList) m_interpts1.Add(dp.m_pt);

  319.             return m_interpts1;
  320.         }
  321.         private struct m_DistPoint3d
  322.         {
  323.             public double m_dist;
  324.             public Point3d m_pt;
  325.         }
  326.         private class m_DistPtsSort : IComparer
  327.         {
  328.             int IComparer.Compare(object a, object b)
  329.             {
  330.                 m_DistPoint3d dp1 = (m_DistPoint3d)a;
  331.                 m_DistPoint3d dp2 = (m_DistPoint3d)b;
  332.                 if (dp1.m_dist > dp2.m_dist)
  333.                     return 1;
  334.                 if (dp1.m_dist < dp2.m_dist)
  335.                     return -1;
  336.                 else
  337.                     return 0;
  338.             }
  339.         }

  340.         //二维多段线转换为轻量多段线
  341.         public Polyline m_Polyline2dToLWPolyline(ObjectId m_ObjId)
  342.         {
  343.             Polyline m_pl = new Polyline();

  344.             Polyline2d m_pl2d = m_OpenEntity(m_ObjId) as Polyline2d;
  345.             if (m_pl2d != null)
  346.             {
  347.                 switch (m_pl2d.PolyType)
  348.                 {
  349.                     case Poly2dType.FitCurvePoly:
  350.                         m_pl.ConvertFrom(m_pl2d, false);
  351.                         break;
  352.                     case Poly2dType.SimplePoly:
  353.                     case Poly2dType.CubicSplinePoly:
  354.                     case Poly2dType.QuadSplinePoly:
  355.                         int index = 0;
  356.                         foreach (ObjectId vid in m_pl2d)
  357.                         {
  358.                             Vertex2d v2d = m_OpenEntity(vid) as Vertex2d;
  359.                             if (v2d.VertexType != Vertex2dType.SplineControlVertex)
  360.                                 m_pl.AddVertexAt(index++, new Point2d(v2d.Position.X, v2d.Position.Y), 0, v2d.StartWidth, v2d.EndWidth);
  361.                         }
  362.                         m_pl.LayerId = m_pl2d.LayerId;//继承层属性
  363.                         m_pl.Elevation = m_pl2d.Elevation;//继承高程属性
  364.                         m_pl.LinetypeId = m_pl2d.LinetypeId;//继承线型属性
  365.                         m_pl.ColorIndex = m_pl2d.ColorIndex;//继承颜色属性
  366.                         break;
  367.                     default:
  368.                         break;
  369.                 }
  370.             }
  371.             return m_pl;
  372.         }
  373.         #endregion

  374.     }

  375. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2017-5-15 11:53:07 | 显示全部楼层
有什么用?????
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2017-5-23 08:16:30 | 显示全部楼层
很实用,多谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2017-5-23 16:42:05 | 显示全部楼层
试了一下有些实体裁剪不了或者如果图形较大,框外不删除
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 34个

财富等级: 招财进宝

发表于 2018-1-6 14:35:50 | 显示全部楼层
谢谢,学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2018-3-12 23:15:46 来自手机 | 显示全部楼层
学习,感谢版主
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-28 04:34 , Processed in 0.380236 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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