我需要创建一个C#objectarx函数,该函数将检查折线是否已连接并打开。如果是这样,则关闭它们的折线。无法使用此示例代码,因为它不会检查是否已连接:
if (polyline.Closed == false)
{
// Close polyline
polyline.Closed = true;
}
我发现了如何做,但是它在LISP中。有人知道如何将其转换为C#objectarx .net吗?
;; PLsCloseCorners.lsp [command name: PLsCL for PolyLines CLose]
;; To Close all open lightweight Polylines, with the start/end
;; vertex at the [apparent] intersection of the starting and
;; ending segments, without coincident start/end vertices.
;; If one "looks" closed (i.e. last vertex coincides with first one),
;; but is not closed in Polyline terms, this will close it from
;; the next-to-last vertex, not by adding a zero-length segment.
;; [If beginning and/or ending Polyline segment is/are arcs, and
;; start/end vertices are not coincident, will locate new corner
;; as if endpoints of arc(s) are endpoints of line segment(s);
;; if ending segment is an arc and start/end vertices are not
;; coincident, will alter arc's path.]
;; Kent Cooper, July 2009
;;
(defun C:PLsCL (/ plset pl plverts corner)
(setq cmde (getvar 'cmdecho))
(setvar 'cmdecho 0)
(command "_.undo" "_begin")
(setq plset (ssget "X" '((0 . "LWPOLYLINE"))))
; omit the "X" from the above line to let User select them
(while (> (sslength plset) 0)
(setq pl (ssname plset 0))
(if (not (vlax-curve-isclosed pl))
(progn
(setq
plverts (cdr (assoc 90 (entget pl))); number of vertices
corner
(inters
(vlax-curve-getStartPoint pl)
(vlax-curve-getPointAtParam pl 1)
(vlax-curve-getPointAtParam pl (1- plverts))
(vlax-curve-getPointAtParam pl (- plverts 2))
nil
); end inters & corner
); end setq
(command
"_.pedit"
pl
"_edit"
"_move"
corner
); end command
(repeat (- plverts 2)
(command "_next"); move to next-to-last vertex
); end repeat
(command
"_break"
"_next"
"_go"
"_eXit"
"_close"
""
); end command
); end progn
); end if
(ssdel (ssname plset 0) plset)
); end while
(command "_.undo" "_end")
(setvar 'cmdecho cmde)
(princ)
); end defun
我实际上想做的是确定是否应关闭折线。想象一条形状为字母C的折线,另一条形状为字母O的折线。在这种情况下,我想关闭形状为字母O的那条线。
示例:
public bool IsPolylineConnected(Polyline pline)
{
// Convert the code from the LSP to C#
// A polyline with the shape of the letter C would return false
// A polyline with the shape of the letter O would return true
}
答案 0 :(得分:0)
如果将多段线投射为曲线对象,则可以检查起点和终点是否相同。
将多段线投射为曲线可以省去处理不同多段线类型的麻烦。
答案 1 :(得分:0)
您可以提供测试图吗? 而且,如果您真的想在Lisp中使用该逻辑,则始终可以从.NET调用LISP函数。
例如,您具有lisp功能
;(defun DoIt()
;Define the Lisp function as a command using c:
(defun c:DoIt()
(setq pntA (getpoint "\nPick A")
pntB (getpoint pntA "\nPick B")
)
(grdraw pntA pntB 1 2)
)
C#:
[CommandMethod("DoIt", CommandFlags.Session)]
public void DoItMethod()
{
DocumentCollection acDocMgr = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
Document acDoc = acDocMgr.Open(@"C:\SampleDrawings\Lights.dwg", false);
using (DocumentLock dl = acDoc.LockDocument())
{
Editor ed = acDoc.Editor;
using (ResultBuffer rb = new ResultBuffer())
{
rb.Add(new TypedValue((int)LispDataType.Text, "c:DoIt"));
ResultBuffer rbRes = Application.Invoke(rb);
if (rbRes != null)
{
TypedValue[] tvalues = rbRes.AsArray();
foreach (TypedValue tv in tvalues)
ed.WriteMessage("\n" + tv.ToString());
rbRes.Dispose();
}
else
ed.WriteMessage("\n Result buffer is null.");
}
}
}