ä»åã¯ãMultiCAD.NET APIã䜿çšããŠNanoCADã§ã«ã¹ã¿ã ãªããžã§ã¯ããäœæããæ¹æ³ãç解ããå¿ èŠããããŸããã Nanosoftã®ããã°ã«ã¯ã2013幎ã®èšäºãããã ã«ã¹ã¿ã ããªããã£ããäœæããéã®åºæ¬çãªåé¡ã«ã€ããŠèª¬æããŠããŸãã ãã ãããã®èšäºãåçŽã«è€è£œããããšã¯é¢çœããªãããšã«åæãããããå°ãè£è¶³ããŸãã
ããã§ã¯ãæ¬äŒŒ3次å ãã¢ãäœæããŸã ããã®ãã¢ãééã§ããŸãã ãããŠãç§ãã¡ã®å°ããªãã¢ãå€ç¬ã«ãªããªãããã«ã圌女ã®ããã«åœŒå¥³ãäœããŸã-åãå£ã§ãã
ãã®å Žåã®ãç䌌3Dããšããçšèªã¯ããªããžã§ã¯ãããœãªããããã£ã®ã¢ãã«ã®ããããã£ãæããªãããšãã€ãŸãã3次å 座æšç³»ã§æ¥ç¶ããã幟äœããªããã£ãã®ã»ããã«ãããªãããšãæå³ããŸãã ãã¶ãããã¯å®å šã«æ£ããçšèªã§ã¯ãªããããããŸãããããããŸã§ã®ãšããç§ã¯ãã以äžè¯ããã®ãåãäžããŠããŸããã
æ®å¿µãªãããç§ã¯çŸåšããã°ã©ããŒãšåŒã°ããããšã¯ã§ããªãã®ã§ããã®èšäºã¯åå¿è ããåå¿è ãŸã§ããããããã¹ãŠã®ã³ãŒãã®ã¹ã¿ã€ã«ã«ãªããããã«åºäŒããã¯ããã¯ã¯æ¹åãããå¯èœæ§ããããŸãã
èšèšãCADãNanoCADã.NETåãã®éçºãç¹ã«CïŒãçŸãšã»ãµãã¹ããªãŒãã«èå³ããããªãããã®èšäºã¯ããããããªãã ãã®ãã®ã§ãã
ãŸããçŸãšã»ãµãã¹ããªãŒãã¯ã©ãã«ããã®ã§ããããïŒ ããããç«ã®äžã§æè¿ãããŠããŸãã

ç§ã¯åçãªäžæåæ¢ããšã¹ã«ã¬ãŒãããŸãããçŸã¯ç§ãã¡ãä»æ¥ããããšã®æå³ã®ç¡ãã説æããããã®é phorã§ãïŒå°ãåŸã®åçïŒã
ããŠãã»ãµãã¹ããªãŒãã¯ãæè¿èŠããŠããã ãã§ããããã人圢ã®ã²ã©ããã¹ã¿ã«ãžã¢ã«æãããã®ã§ãåäžã®ã¹ã¿ã€ã«ã®ã¹ããŒãªãŒããªã³ã°ã«èããããããã«ãªããŸããã
ãããããé°è¬ãããã»ã©æ©ãæããã«ããã®ã¯æãã ã£ãã®ã§ããããïŒ ããããåŒãç¶ãèšäºãèªã¿ç¶ããŠãã ããã
å 容ïŒ
ããŒãIïŒæ°ããCADã䜿çšããŠïŒ ïŒã¯ããã«ïŒã
ããŒãIIïŒNanoCAD 8.5ã®ã³ãŒãã®èšè¿°
ããŒãIIIïŒã³ãŒããç¡æã®NanoCAD 5.1ã«é©åãããããšããŠããŸãã
ããŒãIVïŒMultiKukishïŒçµè«ïŒ
1.æ°ããCADã§ïŒ ïŒã¯ããã«ïŒã

ãŸããNanoCAD 8.5 SDKã®å®å®ããŒãžã§ã³ãNanoCADéçºè ããŒã¿ã«ã§å©çšå¯èœã«ãªããŸãããä»åã¯ããã«çŠç¹ãåœãŠãŸãã
NanoCAD 8.1ã«çŠç¹ãåœãŠãç§ã®ååã®èšäºã§ã¯ããã©ãããã©ãŒã ã«é¢ããæèŠãå ±æããã¢ã»ã³ããªã®ãããžã§ã¯ããæºåããããã»ã¹ãæ€èšããç°¡åãªã³ãã³ããäœæããŸããããã®ãããNanoCADãšMultiCAD .NET APIã䜿çšããéçºã«å®å šã«æ £ããŠããªãå Žåã¯ãéå§ã§ããŸããScarless Faceãã®èšäºãŸãã¯Multicad.NET API 7ã®æåã®æé ïŒNanocad 8.1ã®å ŽåïŒ
ä»åã¯ããæ°Žã泚ããããšãæžãããæè¡é¢ã«ãã£ãšæ³šæãæãäºå®ã§ãã
ç§ãã¡ã®æœèšã®éçºã«ç§»ãåã®å¯äžã®ããšã¯ããã®èšäºãå§ããåã«ãæ¬è³ªçã«2013幎ã«ãã§ã«ãªãªãŒã¹ãããNanoCADïŒNC 5.1ïŒã®ç¡æçã®ã¿ã䜿çšãããšããããšã§ãã
ããã«ã¯2ã€ã®çç±ããããŸããããã¯ããããç®çã§å®å šã«ç¡æã§ããã2çªç®ã®çç±ã¯ç§ãéåžžã«åŒ±ãã³ã³ãã¥ãŒã¿ãŒã䜿çšããŠãããããAutoCADãé ããªããè² è·ãéåžžã«ãããããšã§ãã
ãããããã®èšäºãæžãåã«ãããã³ãã§ãªããžã§ã¯ããæç»ããç·Žç¿ããããªããžã§ã¯ãã®3D衚瀺ã®ä»çµã¿ãç解ããæãéèŠãªããšãšããŠããããã°ããã»ã¹ã§10,000åCADãåèµ·åããå¿ èŠããã£ããããNanoCAD 8.5ãå°ã調ã¹ãŸããã
ãããã£ãŠãäžèŠãããšãå€ãç¡æããŒãžã§ã³ãããæç»ããæ¹ãå¿«é©ã§ãããå€ãNanoCAD 5.1ãšåããããéãèªã¿èŸŒãŸããŸããã€ãŸããNC 8.5ã¯ä»ã®ãã¢ãããæ°åéãèµ·åããŸã-AutoCAD 2017ã¹ããããŠã©ããã«ããèšæž¬ïŒã ãã€ãäŒç€Ÿãç¡æçãæŽæ°ãããé»åçé倧æãã®æ©èœã«é¢ããæ°ããAPIãšæ°ãããããã«ç§»è¡ããããšãæåŸ ããã ãã§ãã
æåŸã«ãéçºè ãå©çšã§ããNanoCADã®ããŒãžã§ã³ã§ç解ããŠããããã«ã3Dãœãªããã¢ããªã³ã°ã¢ãžã¥ãŒã«ãå«ãŸããŠããŸãããç¹ã«ãŠãŒã¶ãŒãäœæãããªããžã§ã¯ãã®å Žåã¯ãããã«APIãç解ã§ããŸããã§ããã 次åã¯å匷ãããããããŸããã ãããŸã§ã®éããç䌌3Dããªããžã§ã¯ãã«æºè¶³ããŸãã
ããã«ã¯ç¬èªã®å©ç¹ããããŸããå°ãé©å¿ããåŸã®ã©ã€ãã©ãªã¯ãç¡æã®NanoCAD 5.1ã§éå§ããããœãªããã¢ããªã³ã°ã¯ãŸã£ãããããŸããã ããããããã«ã€ããŠã¯åŸã§ã
2. NanoCAD 8.5ã§ã³ãŒããèšè¿°ããŸã

ã¯ããã¯ãããã©ã³ã»ã¶ããã¯äŒ¯çµã¯ãã¹ãŠãæ£ããæ°ããŸããïŒ ããããã®çŸãå£ããã¢ãæåŸãŸã§èŠããšãçµããã«ãªããŸãã ããã§ããµã€ã³ã«ãŠã³ãã«æ°ããã¿ã¹ã¯ããããŸã-èšäºã®ãã¥ãŒãšæ祚ãã«ãŠã³ãããŸãã ç§ã¯ãã§ã«ããããŸã£ããã«èãããšãã§ããŸãïŒã1ã1ãã¥ãŒã2-2ãã¥ãŒã3 ...ã
éåžžã©ãããå®å šãªã¯ã©ã¹ã³ãŒããšdwgãã¡ã€ã«ã®äŸã¯GitHubã«ãããŸã ã
ãããŠä»ããããéšåã«å解ãå§ããŸãã æ¢è£œã®ã¢ã»ã³ããªãé©çšããŸããã§ããããããžã§ã¯ããèªåã§çµã¿ç«ãŠãããšãã§ãããšæããŸãã åã®èšäºã§ ãNanoCAD 8.1çšã«MS Visual Studio 2015ã®ãããžã§ã¯ããäœæããã³æ§æããæ¹æ³ãåçã§è©³ãã説æããŸããã
ãããã£ãŠãä»åã¯ãNanocad 8.5ã§ãã«ãããæé ã«ã€ããŠç°¡åã«èª¬æããŸãã
- æ°ãããããžã§ã¯ããäœæãã.NET Framework 4ãã©ãããã©ãŒã ãéžæããCïŒã¯ã©ã¹ã©ã€ãã©ãªããã³ãã¬ãŒããšããŠéžæããŸãã
- Nanocadã®x64ããŒãžã§ã³ïŒããã³1ã€ãããŸãïŒã®SDK \ include-x64 \ãã©ã«ããããmapibasetypes.dllãmapimgd.dllãimapimgd.dllãžã®ãããžã§ã¯ããªã³ã¯ãè¿œå ããŸãã 3ã€ã®ã©ã€ãã©ãªãã¹ãŠã«ã€ããŠãããŒã«ã«ã«èšå®ãããããããã£ãFalseã«ã³ããŒããããšãå¿ããªãã§ãã ããã
- ãŸããMicrosoftã®ã¢ã»ã³ããªãªã³ã¯System.Windows.Forms.dllãSystem.Drawing.dllãè¿œå ããŸãã
- ãããžã§ã¯ãããããã£ã®[ãããã°]ã¿ãã§ãèµ·åæã®ã¢ã¯ã·ã§ã³ãšããŠ[å€éšããã°ã©ã ã§éã]ãéžæããNC 8.5å®è¡å¯èœãã¡ã€ã«ãžã®ãã¹ãæå®ããŸãïŒCïŒ\ Program Files \ Nanosoft \ nanoCAD x64 Plus 8.5 \ nCad.exeããããŸãïŒ ïŒ
- ãã¢ãšå£ã«ããããDoorPseudo3D.csãšWalllPseudo3D.csã®2ã€ã®ã¯ã©ã¹ãäœæããŸãããã
- ã¢ãã¬ã¹CïŒ\ ProgramData \ Nanosoft \ nanoCAD x64 Plus 8.5 \ DataRWïŒå€æŽãããå ŽåããããŸãïŒã«ç§»åãã次ã®å 容ã®ãã¡ã€ã«load.configãæ€çŽ¢ãŸãã¯äœæããŸã
<root> <list> <module path="C:\Users\...\bin\Debug\nanodoor2.dll"/> </list> </root>
ãããžã§ã¯ãã®ååã¯åœç¶ãããŸããããããžã§ã¯ããžã®ãã¹ã¯ç°ãªãå ŽåããããŸãã
ããŠãããã§éçºã®æºåã¯å®äºã§ããF5ãæŒããšãNC 8.5ãèªåçã«èµ·åããã¢ã»ã³ããªãçŽã¡ã«èªã¿èŸŒãŸããŸããéçºãããã³ãã³ããå ¥åããã ãã§ãã
ããäžåºŠç³ãäžããŸãããç§ã¯ããã°ã©ããŒã§ã¯ãªããããã³ãŒãã«å€ãã®æ¬ é¥ãããå¯èœæ§ããããŸãããªããžã§ã¯ãã®ä¿åã移åãã³ããŒæã®å€±æãããã³åã«æé©ã§ãªããœãªã¥ãŒã·ã§ã³ã§ãã 誰ãããã³ãŒãã倧ããè€éã«ããããšãªãããšãŽãæãèµ·ããããããšãã§ãããªãããå°é¢ã«åŒãã
ããããäœããã®æ¹æ³ã§ããã®ã³ãŒãã«åºã¥ããŠãããªããšç§ã¯ãªããžã§ã¯ããäœæããæ¹æ³ãå°ãç解ããããšãã§ããŸããã€ãŸãã圌ã¯äž»ãªç®æšãéæããŸãã
ãã¡ãããNanoCADéçºè ãã©ãŒã©ã ã®Alexander Polkhovskyã«å€§ãã«æè¬ããªããã°ãªããŸããã圌ã¯ãªããžã§ã¯ãã®ç§»åãšå転ã«é¢é£ããæ©èœã®åå®çŸ©ïŒãã¢ã®ééã«åœ¹ç«ã€ïŒã倧ãã«å©ããŠãããŸããã ãããŠãä»ã®ãã¹ãŠã®ãã©ãŒã©ã åå è ã®ãããã§ãããã¯çŸæç¹ã§MultiCAD.NET APIã«é¢ããæãã¢ã¯ã»ã¹ããããæ å ±æºã®1ã€ã§ããããšãæãåºãããŠãã ããã
å®è¡ãããç°¡åã§ãããããå£ããå§ããŸãã
ãŸããåå空éãè¿œå ããŸãããã
using System; using System.Collections.Generic; using System.ComponentModel; using Multicad.Runtime; using Multicad.DatabaseServices; using Multicad.Geometry; using Multicad.CustomObjectBase; using Multicad;
次ã«ãã«ã¹ã¿ã ãªããžã§ã¯ãã¯ã©ã¹ãäœæããŸãã
namespace nanowall2 { //change "8b0986c0-4163-42a4-b005-187111b499d7" for your Guid from Assembly. // Be careful GUID for door and wall classes must be different! // Otherwise there will be problems with saving and moving [CustomEntity(typeof(WalllPseudo3D), "8b0986c0-4163-42a4-b005-187111b499d7", "WalllPseudo3D", "WalllPseudo3D Sample Entity")] [Serializable] public class WalllPseudo3D : McCustomBase {
奜ããªã¯ã©ã¹åã䜿çšããŸãïŒç§ã®ãã®ãæ®ãããšãã§ããŸãïŒãäž»ãªããšã¯ãMcCustomBaseããç¶æ¿ããããšã§ãã
ãã¹ãŠã®ã¯ã©ã¹å±æ§ãå¿ èŠã§ããæ£çŽã«èšããšãCustomEntityå±æ§ãã©ã¡ãŒã¿ãŒãå®å šã«ç解ããŠããªãã®ã§ãé¡æšããŠæãã«ãããããçŽããŸããã
ã8b0986c0-4163-42a4-b005-187111b499d7ã-ç§ã®äŸã§ã¯ãããã¯GUIDã§ãã.NETããã¥ã¡ã³ãã§ãã®æäœæ¹æ³ã説æããç¬éã«ããã¯ãªãã¯ãããããã§ãã ç°¡åã«èšããšãäžæã«ããããã«æåŸã®æ¡ã眮ãæããŠã¢ã»ã³ããªèšå®ãã¡ã€ã«ããååŸããŸããã ãã¢ã¯ã©ã¹ãšå£ã¯ã©ã¹ã®GUIDãå®å šã«åãã§ããå Žåãå¥è·¡ãå§ãŸããŸãïŒã³ããŒãããšå£ããã¢ã«å€ããããã¡ã€ã«ãä¿åããåŸã«ãã¢ã®æ©èœã倱ãããŸããèªåã§ä¿®æ£ããŠãåé¡ãçºçããªãããšãé¡ã£ãŠããŸãã
ã¯ã©ã¹ã®ãã£ãŒã«ããå®çŸ©ããŸãã
private Point3d _pnt1 = new Point3d(100, 100, 0); private Point3d _pnt2 = new Point3d(500, 100, 0); private double _h = 2085;
ãã£ãŒã«ã_pnt1ããã³_pnt12ããããã¯å£ã®ãžãªã¡ããªãæ§ç¯ãããããŒã¹ãã€ã³ãã§ãïŒå£ã®é·ãã¯åºæ¬çã«ïŒã_ hã¯ããã©ã«ãã®å£ã®é«ãã§ãïŒãªããžã§ã¯ããäœæããåŸãä¿®æ£ã§ããŸãïŒã
次ã«ãã³ãŒã«ããŒã ãäœæãããã¢ã®æŠèŠã説æããŸãã
CommandMethodå±æ§ã®DrawWallãããã¯ããªããžã§ã¯ããåŒã³åºãããã«ã³ãã³ãã©ã€ã³ã«å ¥åããã³ãã³ãã®ååã§ããããšãã°ãæ©èœã倱ãããšãªããDWallã«ãã£ãŠççž®ã§ããŸãã
[CommandMethod("DrawWall", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void DrawWall() { WalllPseudo3D wall = new WalllPseudo3D(); wall.PlaceObject(); }
ããŒã ãå®è£ ããã¯ã©ã¹ã§ã¯ãwallã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŠããŸãïŒãããè¡ãããªãå Žåããã¹ãŠã®å£ã1ã€ã®ãè¶ ãå£ãšããŠèªèãããããã«ãªããŸãïŒã PlaceObjectã¡ãœãããå°ãåŸã§å®çŸ©ããŸãã
ãªããžã§ã¯ããã¬ã³ããªã³ã°ããæé ãå®çŸ©ããŸãã
public override void OnDraw(GeometryBuilder dc) { dc.Clear();
ç§ã¯ãã®éšåãå®å šã«ã¯ç解ããŠããŸããããã©ããããããAPIã«ã¯GeometryBuilderã¯ã©ã¹ããããããã«åºã¥ããŠå£ã®ã¹ã«ã«ãããç¶ããŸãã
Dc.Clearã¯ãã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹çšã«ä»¥åã«æ§ç¯ããããã¹ãŠã®ãžãªã¡ããªãæ¯åã¯ãªã¢ããããã§ãã
ããã«ã·ã³ãã«ã
Point3d pnt1 = _pnt1; Point3d pnt2 = new Point3d(_pnt2.X, pnt1.Y, 0); Point3d pnt3 = new Point3d(pnt2.X, pnt1.Y+150, 0); Point3d pnt4 = new Point3d(pnt1.X , pnt3.Y, 0); // Set the color to ByObject value dc.Color = McDbEntity.ByObject; Vector3d hvec = new Vector3d(0, 0, _h);
å£ã®ããŒã¹ãšããããæ§ç¯ãããããŒã¹ãšãªã4ã€ã®ããŒã¹ãã€ã³ããå®çŸ©ããæåãš2çªç®ã®ãã€ã³ãã¯ã¯ã©ã¹ã®ãã£ãŒã«ãã«ãªã³ã¯ãããŸããã€ãŸããåŸã§ããããæäœããŸãã å£ã®é·ãã¯ããã€ã³ã_pnt1ãšpnt2ã®éã®è·é¢ã«å¿ããŠæ§ç¯ãããŸãããå£ã®å¹ ã¯åºå®ããã®ãé£ããèšå®ãããŠããŸããïŒç°¡åã«ããããã«è¡ãããŸãïŒããé¡æšã«ãã£ãŠäœæ¥ããžãã¯ãç°¡åã«åå®çŸ©ã§ããŸãã
dc.Color-ãªããžã§ã¯ãã®ãããã¯ããããã£ã§è²ãèšå®ããŠããããã§ãã
ãã¯ãã«hvecã¯å£ã®é«ãã§ãããããããŒã¹ã«è¿œå ããŠäžéšãæ§ç¯ããŸãã
次ã«ãå£ã®äžåŽãšäžåŽãæããŸãã
dc.DrawPolyline(new Point3d[] { pnt1, pnt2, pnt3, pnt4, _pnt1 }); dc.DrawPolyline(new Point3d[] { _pnt1.Add(hvec), pnt2.Add(hvec), pnt3.Add(hvec), pnt4.Add(hvec), pnt1.Add(hvec)});
äžéšãšäžéšããªãã§æ¥ç¶ããŸãã
dc.DrawLine(pnt1, pnt1.Add(hvec)); dc.DrawLine(pnt2, pnt2.Add(hvec)); dc.DrawLine(pnt3, pnt3.Add(hvec)); dc.DrawLine(pnt4, pnt4.Add(hvec));
hatchåã®ããã®è±ç²ã®èŒªéãäœæããã¬ã³ã¬brickåã§å¡ãã€ã¶ããŸãïŒhatchåã®ååã¯ããã°ã©ã èªäœã§ç¢ºèªã§ããŸãïŒã ããã«ãããªã©ã€ã³ã®ãªã¹ããã·ã§ãŒãã£ã³ã°ã§ãããæé ã2åç¹°ãè¿ãå¿ èŠããããŸããã ç§ã¯äœããèæ ®ããªãã£ããšæããŸãã
ãããã³ã°ããŠããã®ã¯2ã€ã®å£é¢ã®ã¿ã§ã-äžçªé·ãå Žåã¯ãæ®ããèªåã§ã·ã§ãŒãã£ã³ã°ã§ããŸãã
// Create contours for the front and rear sides and hatch them // In this demo, we hatch only two sides, you can tailor the others yourself List<Polyline3d> c1 = new List<Polyline3d>(); c1.Add(new Polyline3d( new List<Point3d>() { pnt1, pnt1.Add(hvec), pnt2.Add(hvec), pnt2, pnt1, })); dc.DrawGeometry(new Hatch(c1, "BRICK", 0, 20, false, HatchStyle.Normal, PatternType.PreDefined, 30), 1); List<Polyline3d> c2 = new List<Polyline3d>(); c2.Add(new Polyline3d( new List<Point3d>() { pnt4, pnt4.Add(hvec), pnt3.Add(hvec), pnt3, pnt4, })); dc.DrawGeometry(new Hatch(c2, "BRICK", 0, 20, false, HatchStyle.Normal, PatternType.PreDefined, 30), 1); }
ãªããžã§ã¯ãã®ã«ã¹ã¿ã ããããã£ãå®çŸ©ããŸããç§ã®æèŠã§ã¯ã2次å 圢åŒã§æç»ããæ¹ã䟿å©ã§ãæç»æã«å£ã®é«ããèšå®ããã®ã¯äžäŸ¿ã§ããå£ã®é«ããæç»æé ã®äžéšãšããŠèšå®ã§ããŸãããããç°¡åãªæ¹æ³ã§ããããã£ãè¿œå ããŸãããã䜿çšããŠãæç»åŸã«é«ããå€æŽããŸãã
//Define the custom properties of the object [DisplayName("Height")] [Description("Height of wall")] [Category("Wall options")] public double HWall { get { return _h; } set { //Save Undo state and set the object status to "Changed" if (!TryModify()) return; _h = value; } }
å±æ§[DisplayNameïŒ "é«ã"ïŒ]-ããããã£ãŠã£ã³ããŠã«è¡šç€ºãããåå[説æïŒ "å£ã®é«ã"ïŒ]ã«ãããšãããã¯èª¬æã§ãããè¡šç€ºå ŽæãããããŸããã§ãã[ã«ããŽãªïŒ "å£ãªãã·ã§ã³"ïŒ] -ãã¢ã®äŸã§åŸè¿°ããããã«ããã£ãŒã«ãã®ã«ããŽãªã¯ã䟿å®äžãã£ãŒã«ããã°ã«ãŒãåã§ããŸãã
ããŠãéåžžã¯ããããã£ãç¶ããŸããUnity3Dã§ãããªãã¯ããããã£ãäœæããããšãããå Žåãã¡ã«ããºã ã¯åæ§ã§ãããšãã£ã¿ãŒããïŒãã®å Žåã¯CADããïŒã¯ã©ã¹ã®ãã£ãŒã«ãã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã
TryModifyïŒïŒã¯å¿ é ã®ã¡ãœããã§ããããªããžã§ã¯ãã®ããããã£ãå€æŽããåã«åŒã³åºãå¿ èŠãããããšãç解ããŠããŸãã ããšæ°å圌ã«äŒããŸãã
次ã«ããªããžã§ã¯ããå³é¢ã«é 眮ããã¡ãœãããåå®çŸ©ããŸãïŒä»¥åã¯ã³ãã³ãã§åŒã³åºããŠããããšãæãåºããŠãã ããïŒã
public override hresult PlaceObject(PlaceFlags lInsertType) { InputJig jig = new InputJig(); // Get the first box point from the jig InputResult res = jig.GetPoint("Select first point:"); if (res.Result != InputResult.ResultCode.Normal) return hresult.e_Fail; _pnt1 = res.Point; // Add the object to the database this.DbEntity.AddToCurrentDocument(); //Exclude the object from snap points jig.ExcludeObject(ID); // Monitoring mouse moving and interactive entity redrawing jig.MouseMove = (s, a) => { TryModify(); _pnt2 = a.Point; this.DbEntity.Update(); }; // Get the second box point from the jig res = jig.GetPoint("Select second point:"); if (res.Result != InputResult.ResultCode.Normal) { this.DbEntity.Erase(); return hresult.e_Fail; } _pnt2 = res.Point; return hresult.s_Ok; }
ãã®ã³ãŒãã¯ãæåã®ç« ã§èª¬æããNanosoftã®äŸããã»ãŒå®å šã«åçšãããŠããŸããã100ïŒ ç解ã§ããŸããããå£ã®æåã®ãã€ã³ãïŒjig.GetPointïŒãå ¥åããã³ãã³ããç°¡åã«åŒã³åºããŠãããå³é¢ïŒDbEntityã AddToCurrentDocumentïŒïŒïŒããã®åŸã2çªç®ã®ãã€ã³ãïŒ_pnt2ïŒã®å ¥åã劚ããªãããã«ããã€ã³ãã£ã³ã°ãããªããžã§ã¯ããé€å€ããŸãã
ãã¹ãŠãæ£åžžãªå Žåããªããžã§ã¯ãã¯å³é¢ã«é 眮ãããããã§ãªãå ŽåïŒããšãã°ãå ¥åãå®äºããŠããªãå ŽåïŒããªããžã§ã¯ãã¯åé€ãããŸãã
ãããŠæåŸã®1ã€ã¯ãå£ã®ãµã€ãºãå€æŽããããã®ãã³ãã«ãäœæããŸãã
// Create a grip for the base point of the object public override bool GetGripPoints(GripPointsInfo info) { info.AppendGrip(new McSmartGrip<WalllPseudo3D>(_pnt1, (obj, g, offset) => { obj.TryModify(); obj._pnt1 += offset; })); info.AppendGrip(new McSmartGrip<WalllPseudo3D>(_pnt2, (obj, g, offset) => { obj.TryModify(); obj._pnt2 += offset; })); return true; } } // TODO: There are many shortcomings in this code. // Including failures when working with copying, moving objects and saving files, you can improve it if you want. }
ç§ãç解ããŠããããã«ãäžèšã®äŸã®ã³ãŒãã¯ããã³ãã«éšåïŒNC 8.Xã®å ŽåïŒã§å€ããªã£ãŠããããããã®äŸã®ã³ãŒãã«æ³šç®ããæ¹ãè¯ãã§ãããã
ãã¡ãããç§ã®ã³ãŒãã¯çæ³ãšã¯ã»ã©é ãããšãèŠåããŸãã®ã§ãé©åã§é©åãªç·šéã«æºè¶³ããŸãã
ãã¢ãèããŠã¿ãŸãããã å§ãŸãã¯äŒŒãŠããŸãã
using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using Multicad.Runtime; using Multicad.DatabaseServices; using Multicad.Geometry; using Multicad.CustomObjectBase; using Multicad; namespace nanodoor2 { //change "8b0986c0-4163-42a4-b005-187111b499d7" for your Guid from Assembly. // Be careful GUID for door and wall classes must be different! // Otherwise there will be problems with saving and moving [CustomEntity(typeof(DoorPseudo3D), "8b0986c0-4163-42a4-b005-187111b499d9", "DoorPseudo3D", "DoorPseudo3D Sample Entity")] [Serializable] public class DoorPseudo3D : McCustomBase { // First and second vertices of the box private Point3d _pnt1 = new Point3d(0, 0, 0); private double _h = 2085; private Vector3d _vecStraightDirection = new Vector3d(1, 0, 0); private Vector3d _vecDirectionClosed = new Vector3d(1, 0, 0); public enum status { closed , middle, open }; private status _dStatus = status.closed; [CommandMethod("DrawDoor", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void DrawDoor() { DoorPseudo3D door = new DoorPseudo3D(); door.PlaceObject(); }
ãã¢ãéããŠãããéããŠããããæ åœãããã£ãŒã«ããè¿œå ãããŠããªãéãã2ã€ã®ãã¯ãã«_vecStraightDirectionã衚瀺ãããŸã-çŸåšã®ãã¢ã®å転ãæ åœãã_vecDirectionClosed-ãã¢ã®å転ã«é¢ããããŒã¿ãéããç¶æ ã§ä¿åããŸã ããã¯åŸã§ãã¹ãŠäŸ¿å©ã«ãªããŸãã
ããããäºæ³ãããããã«ããã¢ã®ãžãªã¡ããªã«ã¯çŽæ¥ãå°ããªå€æŽããããŸãã
public override void OnDraw(GeometryBuilder dc) { dc.Clear(); // Define the basic points for drawing Point3d pnt1 = new Point3d(0, 0, 0); Point3d pnt2 = new Point3d(pnt1.X + 984, pnt1.Y, 0); Point3d pnt3 = new Point3d(pnt2.X + 0, pnt1.Y+50, 0); Point3d pnt4 = new Point3d(pnt1.X , pnt3.Y, 0); // Set the color to ByObject value dc.Color = McDbEntity.ByObject; Vector3d hvec = new Vector3d(0, 0, _h); // Draw the upper and lower sides dc.DrawPolyline(new Point3d[] { pnt1, pnt2, pnt3, pnt4, pnt1 }); dc.DrawPolyline(new Point3d[] { pnt1.Add(hvec), pnt2.Add(hvec), pnt3.Add(hvec), pnt4.Add(hvec), pnt1.Add(hvec)}); // Draw the edges dc.DrawLine(pnt1, pnt1.Add(hvec)); dc.DrawLine(pnt2, pnt2.Add(hvec)); dc.DrawLine(pnt3, pnt3.Add(hvec)); dc.DrawLine(pnt4, pnt4.Add(hvec)); // Drawing a Door Handle dc.DrawLine(pnt2.Add(new Vector3d( - 190, -0, _h*0.45)), pnt2.Add(new Vector3d(-100, 0, _h * 0.45))); dc.DrawLine(pnt3.Add(new Vector3d(-190, 0, _h * 0.45)), pnt3.Add(new Vector3d(-100, 0, _h * 0.45))); // Create contours for the front and rear sides and hatch them // In this demo, we hatch only two sides, you can tailor the others yourself List<Polyline3d> c1 = new List<Polyline3d>(); c1.Add(new Polyline3d( new List<Point3d>() { pnt1, pnt1.Add(hvec), pnt2.Add(hvec), pnt2, pnt1, })); List<Polyline3d> c2 = new List<Polyline3d>(); c2.Add(new Polyline3d( new List<Point3d>() { pnt4, pnt4.Add(hvec), pnt3.Add(hvec), pnt3, pnt4, })); dc.DrawGeometry(new Hatch(c1, "JIS_WOOD", 0, 170, false, HatchStyle.Normal, PatternType.PreDefined, 500), 1); dc.DrawGeometry(new Hatch(c2, "JIS_WOOD", 0, 170, false, HatchStyle.Normal, PatternType.PreDefined, 500), 1); }
æåã«ããã¢ã1ã€ã®ãã€ã³ãã§æ§ç¯ããããšã«æ³šæããŠãã ãããã€ãŸãããã¢ã®å¹ ãšé«ãã®ãµã€ãºã¯å³å¯ã«åºå®ãããŠããŸãïŒå£ãšã¯ç°ãªãããã«ïŒã ãŸããã//ãã¢ãã³ãã«ã®æç»ãã»ã¯ã·ã§ã³ãè¿œå ããŸãããæ¡ä»¶ä»ããã³ãã«ã瀺ã2è¡ããããŸãããŸãããããã³ã°ã®ã¿ã€ããJIS_WOODã«çœ®ãæããŸããã
ãã ãã2çªç®ã®ãã³ãã«ã¯å¿ èŠãªããããPlaceObjectã¡ãœããã¯åçŽåãããŠããŸãã
public override hresult PlaceObject(PlaceFlags lInsertType) { InputJig jig = new InputJig(); // Get the first box point from the jig InputResult res = jig.GetPoint("Select first point:"); if (res.Result != InputResult.ResultCode.Normal) return hresult.e_Fail; _pnt1 = res.Point; // Add the object to the database DbEntity.AddToCurrentDocument(); return hresult.s_Ok; }
次ã«ãå£ã®ã¯ã©ã¹ã«é¢ããå®å šãªæ°èŠæ§ããããŸãã èšäºã®åé ã§ã¢ã¬ã¯ãµã³ããŒã«æè¬ããã
以äžã§ã¯ãã¡ãœãããåå®çŸ©ããŸãããã®ã¡ãœããã¯ããã¢ã®å€æãããªãã¯ã¹ïŒç§»åããã³å転ïŒã®äœæã«äœããã®åœ¢ã§äžå¯è§£ãªè²¬ä»»ãè² ããŸãã
/// <summary> /// Method for changing the object's SC (the graph is built at the origin of coordinates). /// </ summary> /// <param name = "tfm"> The matrix for changing the position of the object. </ param> /// <returns> True - if the matrix is passed, False - if not. </ returns> public override bool GetECS(out Matrix3d tfm) { // Create a matrix that transforms the object. // The object is drawn in coordinates(0.0), then it is transformed with the help of this matrix. tfm = Matrix3d.Displacement(this._pnt1.GetAsVector()) * Matrix3d.Rotation (-this._vecStraightDirection.GetAngleTo(Vector3d.XAxis, Vector3d.ZAxis), Vector3d.ZAxis, Point3d.Origin); return true; }
ãã®æ¹æ³ã®æäœã¯å®å šã«ã¯ç解ããŠããŸããããååãã§ãã¢ãåºç¹ãšå転ãã¯ãã«ã«å¿ããŠå€åœ¢ãããããæçµçã«å³é¢ã§ãã¢ãééããããšãã§ããŸãã
次ã«ããªããžã§ã¯ãã®å€æäžã«çºçãããšæãããã€ãã³ããåå®çŸ©ããŸãã
public override void OnTransform(Matrix3d tfm) { // To be able to cancel(Undo) McUndoPoint undo = new McUndoPoint(); undo.Start(); // Get the coordinates of the base point and the rotation vector this.TryModify(); this._pnt1 = this._pnt1.TransformBy(tfm); this.TryModify(); this._vecStraightDirection = this._vecStraightDirection.TransformBy(tfm); // We move the door only when it is closed if not - undo if (_dStatus == status.closed) _vecDirectionClosed = _vecStraightDirection; else { MessageBox.Show("Please transform only closed door"); undo.Undo(); } undo.Stop(); }
ãŸããéçºã«ãšããããªãããã«ãããã€ãã®ãã€ã³ããç¹ã«ç§ã«ãšã£ãŠé£ãããœãªã¥ãŒã·ã§ã³ãç°¡ç¥åããŸããã ãããã®åçŽåã®1ã€ã¯ããã¢ã®æäœã«é¢ããå¶éã§ãã
ãã¢ã¯ãéãããšãã«ã®ã¿ç§»åãå転ãã³ããŒãããã³å€æŽã§ããŸãïŒããã©ã«ãã§èšå®ãããŠããŸãïŒã
ãããæ©èœãããããã«ãåãæ¶ããªããžã§ã¯ããäœæããå€æŽãã³ãããããããã®éå§ç¹ãããŒã¯ããŸãã
次ã«ããã¹ãŠãæ£åžžã§ããã°ãå€æåŸã®ç¶æ ããã€ã³ã_pnt1ãšãã¯ãã«._vecStraightDirectionã«æž¡ããŸãã
ãã®åŸãç¶æ ã®ãã§ãã¯ãããããã¢ãéããããŠããå Žåãå€æŽãé©çšãããããã«éãããã¢ã®äœçœ®ã«é¢ããããŒã¿ãæ ŒçŽãããã¯ãã«ã«å ¥åãããŸãã
ãã¢ãéãããïŒãŸãã¯åéãïŒå Žåããšã©ãŒã¡ãã»ãŒãžã衚瀺ããããã¹ãŠã®å€æŽããã£ã³ã»ã«ãããŸãã
ãã¢ã®é«ããã£ãŒã«ãã¯å£ã«äŒŒãŠããŸãã
//Define the custom properties of the object [DisplayName("Height")] [Description("Height of door")] [Category("Door options")] public double HDoor { get { return _h; } set { //Save Undo state and set the object status to "Changed" if (!TryModify()) return; _h = value; } }
ãããã次ã®ãã£ãŒã«ãã¯æ°ããã§ã
[DisplayName("Door status")] [Description("Door may be: closed, middle, open")] [Category("Door options")] public status Stat { get { return _dStatus; } set { //Save Undo state and set the object status to "Changed" if (!TryModify()) return; // Change the rotation vector for each of the door states switch (value) { case status.closed: _vecStraightDirection = _vecDirectionClosed; break; case status.middle: _vecStraightDirection = _vecDirectionClosed.Add(_vecDirectionClosed.GetPerpendicularVector().Negate() * 0.575) ; break; case status.open: _vecStraightDirection = _vecDirectionClosed.GetPerpendicularVector()*-1; break; default: _vecStraightDirection = _vecDirectionClosed; break; } _dStatus = value; } }
ãã¢ã®ç¶æ ãæ åœããŠããã®ã¯ãããããã£ãŠã£ã³ããŠã«ããããããŠã³ãªã¹ãã衚瀺ãããããšã§ããå€ã¯ãclosedãmiddleãopenïŒ1察1ãã¯ã©ã¹ã®å é ã®åæã®å®çŸ©ãšããŠïŒã§ãã
åå€ãéžæãããšããã¢ã®å転ã«é¢äžãããã¯ãã«ãæçµçã«å€åããŸãã
éãããããšã以åã«ä¿åãããç¶æ _vecDirectionClosedã«èšå®ãããŸãã
åéç¶æ ã§ã¯ãçµæã®ãã¯ãã«ãååŸãããŸããããã«ããããã¢ãçŽ30床å転ããGOSTã«ããæå®ã®ããã«ãªããŸãã
éããŠãããšãã¯ãè² ã®å€ã䜿çšããŠéããç¶æ ãã¯ãã«ã«å¯ŸããåçŽç·ãååŸããŸãïŒãã®çµæãããã©ã«ãã§ãã¢ãéããŸãïŒã
ããã©ã«ãã®ã±ãŒã¹ã¯ãŸã£ããå¿ èŠãªããšæããŸãããç§ã¯å»ããŸããã
ããŠãæåŸã¯æäœçšã®ãã³ãã«ã§ãã
// Create a grip for the base point of the object public override bool GetGripPoints(GripPointsInfo info) { info.AppendGrip(new McSmartGrip<DoorPseudo3D>(_pnt1, (obj, g, offset) => { obj.TryModify(); obj._pnt1 += offset; })); return true; } // TODO: There are many shortcomings in this code. // Including failures when working with copying, moving objects and saving files, you can improve it if you want. }
ãã¹ãŠãã©ãã°ã§ããŸãã æã ãã§ããéãäž¡æ¹ã®ãªããžã§ã¯ãã«ãã³ãæã£ãŠããŸãããããããããã°ããåã¯ãã¯ããããŸããïŒèšäºãæ©ãçµãããããšæã£ãŠããŸãããããã§ã«3æ¥éå®å šã«æ®ºããŠããŸããïŒã
ãããã£ãŠãF5ããŒãæŒããDRAWWALLããã³DRAWDOORã³ãã³ãã䜿çšããŠãã¢ãšå£ãæ¿å ¥ããŸãã
ãã®çµæãå³ã«ãããã®ãåŸãããŸãã ãã®äžã§ãç§ã¯ããªãã«4ã€ã®ç°ãªãè§åºŠããå³æžé€šã®ä»äºã瀺ããŸãã æ®å¿µãªããçŸã¯å¹³ãã§ãç§ã¯ããããæã§æããã ããŠãå£ã®ãããã¢ã¯ãGitHubã®.dwgãã¡ã€ã«ã®ææ°ããŒãžã§ã³ã®ãã¢ãšã¯å°ãç°ãªãã2ã3ã®å€æŽãå ããã ãã§ãã¹ã¯ãªãŒã³ã·ã§ãããæ®ãçŽãã®ãé¢åã§ããã
NETLOADã³ãã³ãã䜿çšããŠã©ã€ãã©ãªãæåã§ããŒãããå Žåã¯ããªããžã§ã¯ãã§ãã¡ã€ã«ãéãåã«ã©ã€ãã©ãªãããŒãããå¿ èŠãããããšãå¿ããªãã§ãã ãããããããªããšããããã·ãªããžã§ã¯ããšããŠèªèãããŸãã
NanocadãåããŠäœ¿çšããå Žåã¯ã次ã®ããã«ãªããžã§ã¯ãã®3次å ãã¥ãŒãååŸããã®ã䟿å©ã§ããããšãæãåºããŠãã ãããview-> orbit-> dependent orbitã«æ»ãã2次å ãã¥ãŒãæ»ãã«ã¯ãview-> views andprojects-> viewèšç»->çŸåšã®UCS

3.ã³ãŒããç¡æã®NanoCAD 5.1ã«é©å¿ãããããšããŠããŸãã

ååã®èšäºã§ã¯ããªãããã®çç±ã§ããã§ã€ã¹ãã€ã³ãã£ã³ã°ããŒã ã¯ç§ã®ããã«åããŠããŸããã§ããããä»åã¯ã³ãŒããé©åãããããããªå¶éã§ãªããžã§ã¯ããNanoCAD 5.1ã®ç¡æããŒãžã§ã³ã§èµ·åããŸããã
ãŸããç°å¢ã®èšå®æ¹æ³ã«ã€ããŠç°¡åã«èª¬æããŸãããã»ãšãã©éãã¯ãããŸããã
ãããã£ãŠãããã§ããNanocad 5.1ã§ã®ãã«ãæé ã«ã€ããŠç°¡åã«èª¬æããŸãã
- æ°ãããããžã§ã¯ããäœæãã.NET Framework 3.5ãéžæãããã³ãã¬ãŒããšããŠCïŒã¯ã©ã¹ã©ã€ãã©ãªãéžæããŸãã
- Nanocadã®x32ããŒãžã§ã³ïŒããã³5.1ã®ã¿ïŒã®å ŽåãSDK \ include \ãã©ã«ããŒããmapimgdãžã®ãªã³ã¯ããããžã§ã¯ãã«è¿œå ããŸãã ããŒã«ã«ã«èšå®ãããããããã£ãå¿ ãFalseã«ã³ããŒããŠãã ããã
- ãŸããMicrosoftã®ã¢ã»ã³ããªãªã³ã¯System.Windows.Forms.dllãSystem.Drawing.dllãè¿œå ããŸãã
- ãããžã§ã¯ãããããã£ã®[ãããã°]ã¿ãã§ãèµ·åæã®ã¢ã¯ã·ã§ã³ãšããŠ[å€éšããã°ã©ã ã§éã]ãéžæããNC 5.1å®è¡å¯èœãã¡ã€ã«ãžã®ãã¹ãæå®ããŸãïŒCïŒ\ Program FilesïŒx86ïŒ\ Nanosoft \ nanoCAD 5.1 \ nCadããããŸãïŒã exeïŒ
- ãã¢ã»ã³ããªãã»ã¯ã·ã§ã³ã®ããŒãã®åã§ãããæçµãã©ãããã©ãŒã ã§ããx86ãã€ã³ã¹ããŒã«ããŸããã
- ãã¢ãšå£ã«ããããDoorPseudo3D_nc51.csãšWalllPseudo3D_nc51.csã®2ã€ã®ã¯ã©ã¹ãäœæããŠã¿ãŸãããã
- CïŒ\ ProgramData \ Nanosoft \ nanoCAD 5.1 \ DataRWïŒããã¯ããªããšã¯ç°ãªãå ŽåããããŸãïŒãéãã次ã®å
容ã®load.configãã¡ã€ã«ãèŠã€ãããäœæããŸã
<root> <list> <module path="C:\Users\...\bin\Debug\ nanodoor2_51.dll"/> </list> </root>
ãã¡ã€ã«ãžã®ç¬èªã®ãã¹ããããŸãã
ã³ãŒãã«æ ¹æ¬çãªéãã¯ãªããããäž¡æ¹ã®ã¯ã©ã¹ããã¿ãã¬ã®äžã«é ããéãã®ã¿ã説æããŸãã
ã ããå£ïŒ
å£ã®å®å
šãªã³ãŒã
//Use Microsoft .NET Framework 3.5 and old version of MultiCad.NET (for NC 5.1) //Class for demonstrating the capabilities of MultiCad.NET //Assembly for the Nanocad 5.1 //Link mapimgd from Nanocad SDK //Link System.Windows.Forms and System.Drawing //The commands: draws a pseudo 3D wall. //This code in the part of non-infringing rights Nanosoft can be used and distributed in any accessible ways. //For the consequences of the code application, the developer is not responsible. //More detailed - https://habrahabr.ru/post/342680/ using System; using System.ComponentModel; using Multicad.Runtime; using Multicad.DatabaseServices; using Multicad.Geometry; using Multicad.CustomObjectBase; using Multicad; namespace nanowall2 { //change "8b0986c0-4163-42a4-b005-187111b499d7" for your Guid from Assembly. // Be careful GUID for door and wall classes must be different! // Otherwise there will be problems with saving and moving [CustomEntity(typeof(WalllPseudo3D_nc51), "b4edac1f-7978-483f-91b1-10503d20735a", "WalllPseudo3D_nc51", "WalllPseudo3D_nc51 Sample Entity")] [Serializable] public class WalllPseudo3D_nc51 : McCustomBase { // First and second vertices of the box private Point3d _pnt1 = new Point3d(100, 100, 0); private Point3d _pnt2 = new Point3d(500, 100, 0); private double _h = 2085; private double _scale = 1000; [CommandMethod("DrawWall", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void DrawWall() { WalllPseudo3D_nc51 wall = new WalllPseudo3D_nc51(); wall.PlaceObject(); } public override void OnDraw(GeometryBuilder dc) { dc.Clear(); // Define the basic points for drawing Point3d pnt1 = _pnt1; Point3d pnt2 = new Point3d(_pnt2.X, pnt1.Y, 0); Point3d pnt3 = new Point3d(pnt2.X, pnt1.Y+(150 * _scale), 0); Point3d pnt4 = new Point3d(pnt1.X , pnt3.Y, 0); // Set the color to ByObject value dc.Color = McDbEntity.ByObject; Vector3d hvec = new Vector3d(0, 0, _h * _scale); // Draw the upper and lower sidestes dc.DrawPolyline(new Point3d[] { pnt1, pnt2, pnt3, pnt4, pnt1 }); dc.DrawPolyline(new Point3d[] { _pnt1.Add(hvec), pnt2.Add(hvec), pnt3.Add(hvec), pnt4.Add(hvec), pnt1.Add(hvec)}); // Draw the edges dc.DrawLine(pnt1, pnt1.Add(hvec)); dc.DrawLine(pnt2, pnt2.Add(hvec)); dc.DrawLine(pnt3, pnt3.Add(hvec)); dc.DrawLine(pnt4, pnt4.Add(hvec)); } //Define the custom properties of the object [DisplayName("WScale")] [Description("Wall Scale")] [Category("Wall options")] public double WScale { get { return _scale; } set { if (!TryModify()) return; _scale = value; } } [DisplayName("Height")] [Description("Height of wall")] [Category("Wall options")] public double HWall { get { return _h; } set { //Save Undo state and set the object status to "Changed" if (!TryModify()) return; _h = value; } } public override hresult PlaceObject(PlaceFlags lInsertType) { InputJig jig = new InputJig(); // Get the first box point from the jig InputResult res = jig.GetPoint("Select first point:"); if (res.Result != InputResult.ResultCode.Normal) return hresult.e_Fail; _pnt1 = res.Point; // Add the object to the database this.DbEntity.AddToCurrentDocument(); //Exclude the object from snap points jig.ExcludeObject(ID); // Monitoring mouse moving and interactive entity redrawing jig.MouseMove = (s, a) => { TryModify(); _pnt2 = a.Point; this.DbEntity.Update(); }; // Get the second box point from the jig res = jig.GetPoint("Select second point:"); if (res.Result != InputResult.ResultCode.Normal) { this.DbEntity.Erase(); return hresult.e_Fail; } _pnt2 = res.Point; return hresult.s_Ok; } // Create a grip for the base point of the object public override bool GetGripPoints(GripPointsInfo info) { info.AppendGrip(new McSmartGrip<WalllPseudo3D_nc51>(_pnt1, (obj, g, offset) => { obj.TryModify(); obj._pnt1 += offset; })); info.AppendGrip(new McSmartGrip<WalllPseudo3D_nc51>(_pnt2, (obj, g, offset) => { obj.TryModify(); obj._pnt2 += offset; })); return true; } } // TODO: There are many shortcomings in this code. // Including failures when working with copying, moving objects and saving files, you can improve it if you want. }
éãã¯äœã§ããïŒãŸãã空ã®å³é¢ã«ãªããžã§ã¯ããæ¿å ¥ããããšãããšãã«ãNanocadããããã¹ã±ãŒãªã³ã°ããŠå£ããã¢ãèŠããªãããã«ããã¹ã±ãŒã«ä»ãã®ãã£ãŒã«ããè¿œå ããŸããã
å£ã®å Žåãå£ã®åããå€æŽãããã¢ã®å Žåãåããšé·ããå€æŽããŸãã
ãããã£ãŠãç®çã®åº§æšã«ã¯ãéããŠããããããã£ãããã¹ã±ãŒã«ãä¹ç®ãããŸãã
MultiCAD.NET APIã®å€ãããŒãžã§ã³ã®2çªç®ã®éãã¯ããããã³ã°ãæäœããããã®ã¯ã©ã¹ããªãããšã§ããéåžžã®.NETã®APIãä»ããŠå®è£ ã§ãããšæ³å®ã§ããŸãããããã§ã¯ãããŸããã
ä»ãã¢ïŒ
ãã¢ã®å®å
šãªã³ãŒã
//Use Microsoft .NET Framework 3.5 and old version of MultiCad.NET (for NC 5.1) //Class for demonstrating the capabilities of MultiCad.NET //Assembly for the Nanocad 5.1 //Link mapimgd from Nanocad SDK //Link System.Windows.Forms and System.Drawing //The commands: draws a pseudo 3D door. //This code in the part of non-infringing rights Nanosoft can be used and distributed in any accessible ways. //For the consequences of the code application, the developer is not responsible. //More detailed - https://habrahabr.ru/post/342680/ // PS A big thanks to Alexander Vologodsky for help in developing a method for pivoting object. using System; using System.ComponentModel; using System.Windows.Forms; using Multicad.Runtime; using Multicad.DatabaseServices; using Multicad.Geometry; using Multicad.CustomObjectBase; using Multicad; namespace nanodoor2 { //change "8b0986c0-4163-42a4-b005-187111b499d7" for your Guid from Assembly. // Be careful GUID for door and wall classes must be different! // Otherwise there will be problems with saving and moving [CustomEntity(typeof(DoorPseudo3D_nc51), "b4edac1f-7978-483f-91b1-10503d20735b", "DoorPseudo3D_nc51", "DoorPseudo3D_nc51 Sample Entity")] [Serializable] public class DoorPseudo3D_nc51 : McCustomBase { // First and second vertices of the box private Point3d _pnt1 = new Point3d(0, 0, 0); private double _scale = 1000; private double _h = 2085; private Vector3d _vecStraightDirection = new Vector3d(1, 0, 0); private Vector3d _vecDirectionClosed = new Vector3d(1, 0, 0); public enum status { closed , middle, open }; private status _dStatus = status.closed; [CommandMethod("DrawDoor", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void DrawDoor() { DoorPseudo3D_nc51 door = new DoorPseudo3D_nc51(); door.PlaceObject(); } public override void OnDraw(GeometryBuilder dc) { dc.Clear(); // Define the basic points for drawing Point3d pnt1 = new Point3d(0, 0, 0); Point3d pnt2 = new Point3d(pnt1.X + (984 * _scale), pnt1.Y, 0); Point3d pnt3 = new Point3d(pnt2.X + 0, pnt1.Y+(50 * _scale), 0); Point3d pnt4 = new Point3d(pnt1.X , pnt3.Y, 0) ; // Set the color to ByObject value dc.Color = McDbEntity.ByObject; Vector3d hvec = new Vector3d(0, 0, _h * _scale) ; // Draw the upper and lower sides dc.DrawPolyline(new Point3d[] { pnt1, pnt2, pnt3, pnt4, pnt1 }); dc.DrawPolyline(new Point3d[] { pnt1.Add(hvec), pnt2.Add(hvec), pnt3.Add(hvec), pnt4.Add(hvec), pnt1.Add(hvec)}); // Draw the edges dc.DrawLine(pnt1, pnt1.Add(hvec)); dc.DrawLine(pnt2, pnt2.Add(hvec)); dc.DrawLine(pnt3, pnt3.Add(hvec)); dc.DrawLine(pnt4, pnt4.Add(hvec)); // Drawing a Door Handle dc.DrawLine(pnt2.Add(new Vector3d( -190 * _scale, -0, _h*0.45 * _scale)), pnt2.Add(new Vector3d(-100 * _scale, 0, _h * 0.45 * _scale))); dc.DrawLine(pnt3.Add(new Vector3d(-190 * _scale, 0, _h * 0.45 * _scale)), pnt3.Add(new Vector3d(-100 * _scale, 0, _h * 0.45 * _scale))); } public override hresult PlaceObject(PlaceFlags lInsertType) { InputJig jig = new InputJig(); // Get the first box point from the jig InputResult res = jig.GetPoint("Select first point:"); if (res.Result != InputResult.ResultCode.Normal) return hresult.e_Fail; _pnt1 = res.Point; // Add the object to the database DbEntity.AddToCurrentDocument(); return hresult.s_Ok; } /// <summary> /// Method for changing the object's SC (the graph is built at the origin of coordinates). /// </ summary> /// <param name = "tfm"> The matrix for changing the position of the object. </ param> /// <returns> True - if the matrix is passed, False - if not. </ returns> public override bool GetECS(out Matrix3d tfm) { // Create a matrix that transforms the object. // The object is drawn in coordinates(0.0), then it is transformed with the help of this matrix. tfm = Matrix3d.Displacement(this._pnt1.GetAsVector()) * Matrix3d.Rotation (-this._vecStraightDirection.GetAngleTo(Vector3d.XAxis, Vector3d.ZAxis), Vector3d.ZAxis, Point3d.Origin); return true; } public override void OnTransform(Matrix3d tfm) { // To be able to cancel(Undo) McUndoPoint undo = new McUndoPoint(); undo.Start(); // Get the coordinates of the base point and the rotation vector this.TryModify(); this._pnt1 = this._pnt1.TransformBy(tfm); this.TryModify(); this._vecStraightDirection = this._vecStraightDirection.TransformBy(tfm); // We move the door only when it is closed if not - undo if (_dStatus == status.closed) _vecDirectionClosed = _vecStraightDirection; else { MessageBox.Show("Please transform only closed door (when its status = 0)"); undo.Undo(); } undo.Stop(); } //Define the custom properties of the object [DisplayName("Height")] [Description("Height of door")] [Category("Door options")] public double HDoor { get { return _h; } set { //Save Undo state and set the object status to "Changed" if (!TryModify()) return; _h = value; } } [DisplayName("DScale")] [Description("Door Scale")] [Category("Door options")] public double DScale { get { return _scale; } set { if (!TryModify()) return; _scale = value; } } [DisplayName("Door status")] [Description("0-closed, 1-midle, 2-open")] [Category("Door options")] public status Stat { get { return _dStatus; } set { //Save Undo state and set the object status to "Changed" if (!TryModify()) return; // Change the rotation vector for each of the door states switch (value) { case status.closed: _vecStraightDirection = _vecDirectionClosed; break; case status.middle: _vecStraightDirection = _vecDirectionClosed.Add(_vecDirectionClosed.GetPerpendicularVector().Negate() * 0.575) ; break; case status.open: _vecStraightDirection = _vecDirectionClosed.GetPerpendicularVector()*-1; break; default: break; } _dStatus = value; } } // Create a grip for the base point of the object public override bool GetGripPoints(GripPointsInfo info) { info.AppendGrip(new McSmartGrip<DoorPseudo3D_nc51>(_pnt1, (obj, g, offset) => { obj.TryModify(); obj._pnt1 += offset; })); return true; } } // TODO: There are many shortcomings in this code. // Including failures when working with copying, moving objects and saving files, you can improve it if you want. }
ç¹°ãè¿ããŸãããã»ãšãã©ãã¹ãŠãåãã§ããå¯äžã®ããšã§ããããŒãžã§ã³5.1ã§ã¯ããã£ãŒã«ãã¯åæãç°ãªãæ¹æ³ã§åŠçããclosed / openã®ä»£ããã«ãªããžã§ã¯ãã®ããããã£ãŠã£ã³ããŠã«åæå€ã衚瀺ãããŸãïŒ0ã1ã2ã¯ããŸãæ確ã§ã¯ãªããããèŠåãå°ãå€æŽããŸãããšã©ãŒããŸãããã¢ã«ã¯ãããã³ã°ããªããã¹ã±ãŒã«ã«è¿œå ã®ããããã£ããããŸãïŒå¿ èŠã«å¿ããŠãNC 8.5ã®ã¯ã©ã¹ã«ãå®è£ ã§ããŸãïŒã
次ã®ããã«ãªããŸãã

4. MultiKukishïŒçµè«ïŒ

, , . MultiCAD.NET API AutoCAD ZWCAD , .
, . , , AutoCAD 2017, â «MultiCAD_AC_ZC_Enabler_2209_RU.zip» ( 1.5 ), AutoCAD 2016. .
ä»åãå¥ã®ãªãã·ã§ã³ãè©ŠããŠã¿ãããšã«ããZWCAD + 2015ã®è©ŠçšçãããŠã³ããŒãããŸãããããããã®ã¬ã€ã€ãŒããµããŒãããææ°ããŒãžã§ã³ã§ããç§ã¯ç¥ããŸãããå€åç§ã¯ãæ¡æããããããŸãããããã®ã©ã€ãã©ãªãåã®èšäºã®ã©ã€ãã©ãªãZWCADã§æ¥äžæããŸããã§ããããããã£ãŠã誰ããèµ°ã£ãŠãã¹ã¯ãªãŒã³ã·ã§ãããå ±æããŠããããããããããã§ãã
æ®ãã«ã€ããŠã¯ããã®APIãå°ç¡ãã«ããã°ããã»ã©ãããæ·±ãé¢ããåãã奜ãã«ãªãå§ããŸããAPIãæ¹åãããŠããããšãAPIã¯ã©ã¹ã®äžéšã®ã¡ã³ããŒã¯æ¢ã«ãã·ã¢èªã§æ£æ°ãªèª¬æãæã£ãŠããããšããããŠAPIèªäœãããèªçµŠèªè¶³ã«ãªã£ãŠããããšãããããŸãã
DWG 2018ã®ãµããŒããåããNanoCAD 9ïŒãŸãã¯ãããåŒã°ãããã®ïŒããªãªãŒã¹ããããšãããã«è¯ããªããšæããŸãïŒç¹ã«ãéçºè ããã©ãŒã©ã ã§çŽæããããã«ãæ°ããç¡æã®Nanocadãç¶ãå ŽåïŒã
ã ãããNanocadéçºè ãã©ãŒã©ã ã®ãã¹ãŠã®åå è ã«-å©ããŠãããŠãéçºè ã«-NC 8.5ãæçš¿ããŠãããŠããããšãããããŠãã¹ãŠã®èªè ã«-æåŸãŸã§èšäºããã¹ã¿ãŒããŠãããŠããããšãã
PSæåã¯ãã¿ã€ãã«ã®èšäºã¯å¥ã®åçã«ãªã£ãŠããã¯ãã§ãããããæ°·ã§ã¯ãªãããšå€æããæçµçã«æ¿æ²»çã«æ£ããã«ãŒããããšã°ããŒããŒã«çœ®ãæããŸããïŒãšããã§ãåçã®äžéšã¯ç§ãèŠã€ãããããªã«ã€ãªãããŸãïŒãããããç§ã¯èšäºã®äžã§å ã®ç»åãé ãããšã«ããŸãã...
...ãã¿ãã¬
