todouble22 发表于 2022-7-5 23:46:35

花括号的lisp例程

我希望有人能帮我写一个lisp来画一个花括号},它将从起点延伸到终点,作为一种包含与一个标签相关的所有文本的方式。这有意义吗??这类似于express tools特征线的工作方式,但不是将圆弧放置在起点和终点的中点。。我前一段时间看到了一些代码,但再也找不到了?首先,我感谢你的帮助。。

todouble22 发表于 2022-7-5 23:55:50

旁注:我是作为一个动态块来做的,效果很好,但老板想用一种特定的方式来做

jalucerol 发表于 2022-7-5 23:57:44

可以用vb或vb代替lisp。网

todouble22 发表于 2022-7-6 00:07:59

我不明白为什么不?我会再检查一遍,不过看看你有什么就好了。无论如何,我正在努力让vb变得更好。。

gile 发表于 2022-7-6 00:11:54

你好
 
这是一个快捷方式。
 
(defun c:curly (/ p1 p2 a0 a1 a2 d)
(and
   (setq p1 (getpoint "\nFirst point: "))
   (setq p2 (getpoint p1 "\nSecond point: "))
   (setq a0 (angle p1 p2)
         a1 (- a0 (/ pi 12.))
         a2 (+ a0 pi (/ pi 12.))
         d(/ (/ (/ (distance p1 p2) 2.) (cos (/ pi 12.))) 2.)
   )
   (entmake
   (list
       '(0 . "LWPOLYLINE")
       '(100 . "AcDbEntity")
       '(100 . "AcDbPolyline")
       '(90 . 5)
       '(70 . 0)
       (cons 10 p1)
       '(42 . 0.6)
       (cons 10 (polar p1 a1 d))
       '(42 . -0.6)
       (cons 10 (polar p1 a1 (* 2. d)))
       '(42 . -0.6)
       (cons 10 (polar p2 a2 d))
       '(42 . 0.6)
       (cons 10 p2)
   )
   )
)
(princ)
)

fixo 发表于 2022-7-6 00:14:15

 
别笑,这是我的老歌
 

(defun my_error_f(msg)
(setq *error* olderr_f)
(if svfrad
   (setvar "filletrad" svfrad))
(if svosmode
   (setvar "osmode" svosmode))
(setvar "cmdecho" 1)
(print (strcat "error:" msg))
(prin1)
)

(defun C:CBR (/ *error* ang cp1 cp2 cpt ep2 ept
      lp my_error_f olderr_f r resp rf
      sp1 spt svfrad svosmode upt)
               
(setq svosmode (getvar "osmode"))
(setvar "osmode" 0)               
(setq svfrad (getvar "filletrad"))

(setq olderr_f *error*
*error* my_error_f)       

(setvar "cmdecho" 0)

(command "_ortho" "_on")

(setq r 4.0 rf
      (* 1.125 r)
   )
(initget 1 "Left Right")
(setq resp (getkword "\nChoose a braket position : "))
(setq spt (getpoint "\nSpecify upper point : ")
   ept (getpoint spt "\nSpecify lower point : ")
   lp (distance spt ept)
   )
(if
(eq resp "Left")
(progn
(setq sp1 (polar spt pi rf))
(setq ep2 (polar ept pirf))
(setq cpt (polar sp1 (* pi 1.5) ( / lp 2.0))
   upt (polar cpt pi rf))
(setq cp1 (polar cpt (/ pi 2) ( / rf 2.0)))
(setq cp2 (polar cpt (* pi 1.5) ( / rf 2.0)))
)
(progn
(setq sp1 (polar spt 0 rf))
(setq ep2 (polar ept 0rf))
(setq cpt (polar sp1 (* pi 1.5) ( / lp 2.0))
   upt (polar cpt 0 rf))
(setq cp1 (polar cpt (/ pi 2) ( / rf 2.0)))
(setq cp2 (polar cpt (* pi 1.5) ( / rf 2.0)))
)
)
(command "_.osnap" "_none" "")
(command "_.pline")(mapcar 'command (list spt sp1 cp1 upt cp2 ep2 ept)) (command "")
(setvar "filletrad" r)
(command "_.fillet" "_P" "_L")
(princ)
)

 
~'J'~

todouble22 发表于 2022-7-6 00:23:09

fixo和gile。。。非常感谢你!!

gile 发表于 2022-7-6 00:28:33

一个更好的,在C中#
已将DLL附加到netload。
 
using System;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

namespace CurlyJigSample
{
   public class Command
   {
       class CurlyJig : EntityJig
       {
         Polyline m_pline;
         Point3d m_dragPt;
         Point2d p0;
         Vector2d xDir = new Vector2d(1.0, 0.0);

         public CurlyJig(Polyline pline, Point3d dragPt, Point2d pt)
               : base(pline)
         {
               m_pline = pline;
               m_dragPt = dragPt;
               p0 = pt;
         }

         protected override bool Update()
         {
               Point2d p4 = new Point2d(m_dragPt.X, m_dragPt.Y);
               double d = (p0.GetDistanceTo(p4) / 2.0) / (Math.Cos(Math.PI / 12.0));
               Vector2d vec = p0.GetVectorTo(p4);
               double a0 = p4.Y < p0.Y ?
                   (Math.PI * 2.0) - xDir.GetAngleTo(vec) :
                   xDir.GetAngleTo(vec);
               m_pline.SetPointAt(1, Polar(p0, a0 - (Math.PI / 12.0), d / 2.0));
               m_pline.SetPointAt(2, Polar(p0, a0 - (Math.PI / 12.0), d));
               m_pline.SetPointAt(3, Polar(p4, a0 + Math.PI + (Math.PI / 12.0), d / 2.0));
               m_pline.SetPointAt(4, p4);
               return true;
         }

         protected override SamplerStatus Sampler(JigPrompts prompts)
         {
               JigPromptPointOptions jppo = new JigPromptPointOptions("\nSpecify the second point: ");
               jppo.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.GovernedByOrthoMode);
               PromptPointResult ppr = prompts.AcquirePoint(jppo);
               if (ppr.Status == PromptStatus.OK)
               {
                   if (ppr.Value.IsEqualTo(m_dragPt))
                     return SamplerStatus.NoChange;
                   else
                   {
                     m_dragPt = ppr.Value;
                     return SamplerStatus.OK;
                   }
               }
               return SamplerStatus.Cancel;
         }
       }

       private static Point2d Polar(Point2d org, double angle, double distance)
       {
         return new Point2d(org.X + (distance * Math.Cos(angle)), org.Y + (distance * Math.Sin(angle)));
       }

      
       public void CURLY()
       {
         Document doc = Application.DocumentManager.MdiActiveDocument;
         Database db = doc.Database;
         Editor ed = doc.Editor;
         PromptPointResult ppr = ed.GetPoint("\nSpecify the first point: ");
         if (ppr.Status == PromptStatus.OK)
         {
               using (Transaction tr = db.TransactionManager.StartTransaction())
               {
                   Point3d picked = ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem);
                   Point2d pt = new Point2d(picked.X, picked.Y);
                   Polyline pline = new Polyline(5);
                   pline.AddVertexAt(0, pt, 0.6, 0.0, 0.0);
                   pline.AddVertexAt(1, pt, -0.6, 0.0, 0.0);
                   pline.AddVertexAt(2, pt, -0.6, 0.0, 0.0);
                   pline.AddVertexAt(3, pt, 0.6, 0.0, 0.0);
                   pline.AddVertexAt(4, pt, 0.0, 0.0, 0.0);
                   CurlyJig jig = new CurlyJig(pline, picked, pt);
                   PromptResult pr = ed.Drag(jig);
                   if (pr.Status == PromptStatus.OK)
                   {
                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                     btr.AppendEntity(pline);
                     tr.AddNewlyCreatedDBObject(pline, true);
                   }
                   tr.Commit();
               }
         }
       }
   }
}


卷曲夹具。拉链

fixo 发表于 2022-7-6 00:31:37

在我这边效果很好
谢谢
 
~'J'~

MarkytheSparky 发表于 2022-7-6 00:36:01

救命啊!
 
我以前有一个漂亮的brace命令,它会提示用户三件事
 
1、起点
2、终点
3、圆角半径
 
然后,它将绘制一个在两端和中间圆角的直线支架
两端将向右卷曲90度,中间端将向左卷曲,形成经典的大括号{
 
中间的线将保持笔直。
 
由于某种原因,它在2011年停止了工作
 
 
 
(DEFUN C:BRAC()
(INITGET 1)(SETQ A(GETPOINT“\n起始点:”)
(INITGET 1)(SETQ B(GETPOINT A“\n终点:”)
(SETQ C(/(距离A B)2))
(SETQ D(GETDIST(STRCAT“\n填充半径:”))
(IF(NULL D)(SETQ D(+0.01(GETVAR“FILLETRAD”)))(SETQ D(+0.01 D)))
(SETVAR“FILLETRAD”(-D 0.01))
(SETQ E(角度B A))
(SETQ F(+1.570796 E))
(命令“PLINE”B(极轴B F D)
(极坐标(GETVAR“LASTPOINT”)E C)
(极坐标(GETVAR“LASTPOINT”)F D)\r)
(设定值F(-F PI))
(命令“LINE”“@”(POLAR(GETVAR“LASTPOINT”)F D)
(极坐标(GETVAR“LASTPOINT”)E C)
(极坐标(GETVAR“LASTPOINT”)F D)\r)
(命令“FILLET”“P”“@”)
(命令“FILLET”“P”B)
)
 
 
提前感谢
 
markhamilton5@att.net
页: [1] 2
查看完整版本: 花括号的lisp例程