MultiCAD.NET में वस्तुओं का क्रमांकन। ड्राइंग और प्रॉक्सी ऑब्जेक्ट संगतता प्रबंधित करें



पारंपरिक C ++ API (nanoCAD में NRX, ऑटोकैड में ObjectARX) का उपयोग करके कस्टम ऑब्जेक्ट बनाते समय, यह सुनिश्चित करने के लिए कि ऑब्जेक्ट्स को ड्रॉइंग फ़ाइल से सहेजा और पढ़ा जाता है, प्रत्येक फ़ील्ड के रिकॉर्ड (क्रमांकन) और रीडिंग (डीसर्बिलाइज़ेशन) का स्पष्ट रूप से वर्णन करना आवश्यक है। MultiCAD.NET एपीआई .NET डेवलपर्स के लिए एक अधिक परिचित वर्णनात्मक दृष्टिकोण का उपयोग करता है, जो मानक .NET क्रमांकन पर आधारित है।



संस्करण सहिष्णुता सीरियलाइजेशन क्रमांकन का उपयोग डेवलपर्स को पारंपरिक सी ++ एपीआई में मौजूदा की तुलना में विभिन्न संस्करणों की वस्तुओं की संगतता को नियंत्रित करने के लिए अधिक लचीला तंत्र प्रदान करता है, जहां पिछले संस्करणों को पढ़ना प्रदान किया जाता है, लेकिन "भविष्य से" फाइलें पढ़ना असंभव है।



MultiCAD.NET में वस्तुओं के नए संस्करणों का वर्णन करते समय, आप संकेत कर सकते हैं कि नए जोड़े गए फ़ील्ड वैकल्पिक हैं, और फिर एप्लिकेशन के नए संस्करण के प्रारूप में सहेजे गए ड्राइंग को पिछले संस्करण में पढ़ा जाएगा। बेशक, पारंपरिक दृष्टिकोण अपरिवर्तित रहा, जिससे एप्लिकेशन के पिछले संस्करण में एक ड्राइंग को लोड करते समय प्रॉक्सी ऑब्जेक्ट्स (कैश्ड ऑब्जेक्ट ग्राफिक्स) का निर्माण होता है।



कटौती के तहत, हम इस बात पर चर्चा करेंगे कि किसी ऑब्जेक्ट के दो संस्करणों के बीच संगतता कैसे प्राप्त करें, साथ ही साथ यह भी सुनिश्चित करें कि जब एप्लिकेशन के नए संस्करण पुराने चित्र पढ़ते हैं तो संगतता के पारंपरिक स्तर को कैसे सुनिश्चित करें, लेकिन इसके विपरीत नहीं।





आइए देखें कि मल्टीकैडैनेट कैसे इन दोनों दृष्टिकोणों (वीटीएस और प्रॉक्सी ऑब्जेक्ट मैकेनिज़्म) का उपयोग ऑब्जेक्ट संगतता प्रबंधन को व्यवस्थित करने के लिए करता है। एक उदाहरण के रूप में, उपयोगकर्ता के "क्रॉस मार्क" ऑब्जेक्ट के दो संस्करणों पर विचार करें।







प्रयोगों के लिए एक वर्ग बनाना



हमने पिछले लेखों में से एक में मल्टीकाड.नेट में कस्टम प्रिमिटिव बनाने की बुनियादी बातों के बारे में बात की थी, इसलिए हमने इस पर विस्तार से ध्यान नहीं दिया, लेकिन अभी हम उपयोगकर्ता के आदिम "क्रॉस मार्क" का वर्णन करने के लिए आगे बढ़ेंगे:



[CustomEntity("1C925FA1-842B-49CD-924F-4ABF9717DB62", 1, "Crossmark", "Crossmark Sample Entity")] [Serializable] public class CrossMark : McCustomBase { private Point3d pnt1; private Point3d pnt2; private Point3d pnt3; private Point3d pnt4; }
      
      





पूर्ण आवेदन कोड यहां उपलब्ध है । एप्लिकेशन को संकलित करने और इसे क्रॉसमार्क कमांड के साथ लॉन्च करने के बाद, निम्नलिखित आदिम को उपयोगकर्ता इनपुट के परिणाम के आधार पर ड्राइंग में जोड़ा जाएगा:



छवि



परिणामस्वरूप .dwg फ़ाइल सहेजें। अब हम अपनी कक्षा को थोड़ा संशोधित करेंगे, इसमें अतिरिक्त कार्यक्षमता जोड़ेंगे।



कक्षा का दूसरा संस्करण और वस्तुओं की अंतर-अनुकूलता सुनिश्चित करना



कक्षा के दूसरे संस्करण में, हम क्रॉस के केंद्र के केंद्र में एक सर्कल जोड़कर अपनी आदिम की ज्यामिति को बदल देंगे। एक अतिरिक्त फ़ील्ड के रूप में, इस सर्कल के त्रिज्या को जोड़ें, इसे [OptionalField]



विशेषता के साथ प्रदान करते हुए इसे ऑब्जेक्ट के पुराने संस्करण के डीरिएलाइज़ेशन के मामले में वैकल्पिक के रूप में चिह्नित करें। हम संस्करण संस्करण संपत्ति का उपयोग करके नए संस्करण संख्या का संकेत भी देते हैं:



 [OptionalField(VersionAdded = 2)] private double radius = -1;
      
      





कंस्ट्रक्टर में एक नया चर आरंभ करें और इस क्षेत्र तक पहुँचने के लिए एक सार्वजनिक संपत्ति जोड़ें:



 public CrossMark() { ... radius = 10; } [Category("Circular component")] [DisplayName("Circle radius")] [Description("Radius of circular component of the cross mark")] public double Radius { get { return radius; } set { radius = value; } }
      
      





ऑब्जेक्ट को सही मान के साथ OnDeserialized



करने के बाद जोड़े गए फ़ील्ड को इनिशियलाइज़ करने के लिए, [OnDeserialized]



विशेषता के साथ OnDeserialized



विधि का उपयोग किया जाएगा:



 [OnDeserialized] private void OnDeserialized(StreamingContext context) { if (radius == -1) { radius = 10; } }
      
      







अब प्रकार के नए संस्करणों के साथ काम करने वाले एप्लिकेशन पुराने संस्करणों की वस्तुओं को भी स्वीकार कर सकते हैं। इसके अलावा, वीटीएस भी पिछड़ी संगतता की समस्या को हल करता है: पुराने संस्करणों के साथ काम करने वाले अनुप्रयोग नए संस्करणों को स्वीकार कर सकते हैं: "अतिरिक्त" फ़ील्ड को केवल अनदेखा किया जाता है और डीरिएरलाइज़ेशन सफल होता है।



इस प्रकार, हमने अपने वर्ग संस्करणों की पूर्ण संगतता सुनिश्चित की। यह केवल सर्कल को OnDraw()



विधि से जोड़ने के लिए बना हुआ है:



 public override void OnDraw(GeometryBuilder dc) { ... dc.DrawCircle(new Point3d(pnt1.X + 25, pnt1.Y, pnt1.Z), radius); }
      
      





आवेदन के दूसरे संस्करण का पूरा कोड भी संग्रह में उपलब्ध है। हम प्रोजेक्ट को संकलित करते हैं, नैनोकार्ड लॉन्च करते हैं, बिल्ट असेंबली लोड करते हैं और एप्लिकेशन के नए संस्करण को उसी "क्रॉसमार्क" कमांड के साथ लॉन्च करते हैं। प्रविष्टि बिंदु निर्दिष्ट करने के बाद, हमें अपने आदिम के अद्यतन संस्करण के साथ एक .dwg फ़ाइल मिलती है:



छवि



हम परिणामी फ़ाइल को भी सहेजते हैं।



परिणाम


और अब हम दोनों संस्करणों की पूर्ण संगतता के बारे में आश्वस्त होंगे।



हम nanoCAD शुरू करते हैं, विधानसभा के दूसरे संस्करण को लोड करते हैं और फ़ाइल का पहला संस्करण खोलते हैं। फ़ाइल को सफलतापूर्वक खोला जाएगा और पहले संस्करण में संग्रहीत आदिम स्क्रीन पर हमारी प्रतीक्षा कर रहा है। जैसे ही कोई कार्रवाई की जाती है, जो ऑब्जेक्ट को फिर से लाल करने के लिए ले जाती है (उदाहरण के लिए, चलती है), ऑब्जेक्ट को नए संस्करण में फिर से व्यवस्थित किया जाएगा, क्रमिक निर्माण के काम को ध्यान में रखते हुए: क्रॉस चिह्न एक दिए गए त्रिज्या के एक चक्र के साथ खींचा जाएगा। REGENOBJ कमांड का उपयोग इसके लिए भी किया जा सकता है।

फ़ाइल बंद करें। एप्लिकेशन का पहला संस्करण डाउनलोड करें और फ़ाइल का दूसरा संस्करण खोलें। फ़ाइल भी सफलतापूर्वक लोड हो जाएगी और दूसरे संस्करण की वस्तु शुरू में खींची जाएगी, क्योंकि यह फ़ाइल में सहेजी गई थी। रिडरिंग के बाद, क्रॉस मार्क उस फॉर्म में प्रदर्शित होगा जो पहले संस्करण में परिभाषित किया गया था।



पारंपरिक दृष्टिकोण। अनुकूलता शीर्ष पर



वीटीएस तंत्र, जो नीचे से ऊपर तक संगतता सुनिश्चित करता है, हमेशा लागू होता है, क्योंकि वस्तुओं के नए संस्करणों में सभी डेटा महत्वहीन नहीं माना जा सकता है। किसी वस्तु का नया संस्करण बनाते समय ऊपर से नीचे तक अनुकूलता सुनिश्चित करने के लिए, आपको निम्नलिखित फॉर्म की एक विशेषता का उपयोग करना होगा:



 [CustomEntity(guid, majorVersion, databaseName, localName)]
      
      





यहां, majorVersion



प्रॉपर्टी केवल ऑब्जेक्ट का मुख्य संस्करण सेट करती है, जिसके भीतर पूर्ण संगतता सुनिश्चित की जाएगी। यदि प्रमुख ऑब्जेक्ट के साथ नई ऑब्जेक्ट बनाई majorVersion



, जिसका मूल्य पिछले एक से अधिक है, तो जब आप कोड के पुराने संस्करण के साथ ऐसी वस्तुओं को खोलने का प्रयास करते हैं, तो आपको एक eMakeMeProxy



रिटर्न eMakeMeProxy



प्राप्त होगा। इस मामले में, ड्राइंग में वस्तुओं को प्रॉक्सी ऑब्जेक्ट के रूप में प्रस्तुत किया जाएगा, जो उन्हें बदलने और संपादित करने की संभावना को बाहर करता है।



निष्कर्ष



इस लेख में, हमने एक उपयोगकर्ता-परिभाषित ऑब्जेक्ट के दो संस्करण बनाने और सरलतम मामले में संस्करणों के बीच संगतता के प्रबंधन की प्रक्रिया को देखा - जब नए संस्करण में अतिरिक्त डेटा फ़ील्ड जोड़े जाते हैं। हम निम्नलिखित लेखों में से किसी एक पर चर्चा करेंगे ताकि उपयोगकर्ता वस्तुओं के संस्करणों की संगतता को और अधिक गंभीर बदलावों के साथ सुनिश्चित किया जा सके, जैसे कि हटाना, खेतों का नाम बदलना या उनके प्रकार बदलना।



लेख की चर्चा हमारे मंच पर भी उपलब्ध है: forum.nanocad.ru/index.php?showtopic=6515

लेख का अंग्रेजी में अनुवाद: MultiCAD.NET में वस्तुओं को सीरियल करना। चित्रण संगतता और छद्म वस्तुओं का प्रबंधन



All Articles