소스 검색

update SmartSEMControl

@wang_qi0307 5 년 전
부모
커밋
2031a305c5

+ 7 - 0
FileManager/FileManager.csproj

@@ -32,16 +32,23 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="MeasureData, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\Debug\MeasureData.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Data" />
     <Reference Include="System.Net.Http" />
     <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Serialize.cs" />
     <Compile Include="XmlManager.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>

+ 669 - 0
FileManager/Serialize.cs

@@ -0,0 +1,669 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Xml;
+
+namespace FileManager
+{
+    //#define RootClassName  "XMLData"
+    //#define XMLClassEndTag  std::string("</")+RootClassName+">"
+    //#define Empty_String  std::string("")
+
+    public interface Convertinterface
+    {
+        void Serialize(bool isStoring, XmlDocument xml, XmlNode rootNode);
+    }
+
+    public class MemberBase
+    {
+        const string RootClassName = "XMLData";
+        const string XMLClassEndTag = "</" + RootClassName + ">";
+        const string Empty_String = "";
+
+        protected string m_sValue;
+        //public virtual ~MemberBase() { };
+        public virtual void Dispose() { }
+        public string toString() { return m_sValue; }
+        //public const char* c_str() { return m_sValue.c_str(); }
+        public string getStringPtr(string str) { return m_sValue = str; }     //c++原代码为:std::string *getStringPtr() { return &m_sValue; }; 
+    }
+    /**
+		serializable string
+	*/
+    public class xString : MemberBase
+    {
+        public void AssignValue(string value) { m_sValue = value; }           //因为c#无=重载,所以修改为public
+        public xString() { }
+        public xString(string value) { AssignValue(value); }
+        public string value() { return m_sValue; }
+        //public xString operator=(const string value) { AssignValue(value); return *this; }  //c#不可以重载=
+        //public xString operator=(const char* value) { AssignValue(value); return *this; }  //c#不可以重载=
+    }
+
+    public class xInt : MemberBase
+    {
+        public void AssignValue(int value) { m_sValue = value.ToString(); }        //因为c#无=重载,所以修改为public
+        public xInt() { AssignValue(0); }
+        public xInt(int value) { AssignValue(value); }
+        public int value()
+        {
+            int value;
+            value = int.Parse(m_sValue);
+            return value;
+        }
+        //xInt operator=(const int value) { AssignValue(value); return *this; };  //c#不可以重载=
+    }
+
+    public class xDouble : MemberBase
+    {
+        public void AssignValue(double value) { m_sValue = value.ToString(); }       //因为c#无=重载,所以修改为public
+        public xDouble() { AssignValue(0); }
+        public xDouble(double value) { AssignValue(value); }
+        public double value()
+        {
+            double value;
+            value = double.Parse(m_sValue);
+            return value;
+        }
+        //xDouble operator=(const double value) { AssignValue(value); return *this; }; //c#不可以重载=
+    }
+
+    public class xLong : MemberBase
+    {
+        public void AssignValue(long value) { m_sValue = value.ToString(); }   //因为c#无=重载,所以修改为public            public xLong() { AssignValue(0); }
+        public xLong(long value) { AssignValue(value); }
+        public long value()
+        {
+            long value;
+            value = long.Parse(m_sValue);
+            return value;
+        }
+        //xLong operator=(const long value) { AssignValue(value); return *this; };  //c#不可以重载=
+    }
+
+    public class xDWORD : MemberBase
+    {
+        public void AssignValue(uint value) { m_sValue = value.ToString(); }    //因为c#无=重载,所以修改为public
+        public xDWORD() { AssignValue(0); }
+        public xDWORD(uint value) { AssignValue(value); }
+        public uint value()
+        {
+            uint value;
+            value = uint.Parse(m_sValue);
+            return value;
+        }
+        //xDWORD operator=(const DWORD value) { AssignValue(value); return *this; };
+    }
+
+    public class xBool : MemberBase
+    {
+        public void AssignValue(bool value) { m_sValue = value ? "true" : "false"; }       //因为c#无=重载,所以修改为public
+        public xBool() { AssignValue(false); }
+        public xBool(bool value) { AssignValue(value); }
+
+        public bool value()
+        {
+            bool value = false;
+            string sHelp = m_sValue;
+            //transform(sHelp.GetEnumerator(), sHelp.end(), sHelp.GetEnumerator(), toupper);
+            sHelp.ToUpper();
+            if (sHelp == "TRUE")
+                return true;
+            return value;
+        }
+        //xBool operator=(const bool value) { AssignValue(value); return *this; };
+    }
+
+    public class xTime_t : MemberBase   //time_t对应c#类型?long?
+    {
+        public void AssignValue(DateTime value)     //因为c#无=重载,所以修改为public
+        {
+            m_sValue = value.ToString();
+        }
+
+        public xTime_t()
+        {
+            DateTime t = Convert.ToDateTime(0);
+            AssignValue(t);
+        }
+
+        public xTime_t(DateTime value) { AssignValue(value); }
+
+        public DateTime value()
+        {
+            return Convert.ToDateTime(m_sValue);
+        }
+        //xTime_t operator=(const time_t value) { AssignValue(value); return *this; };
+    }
+
+    //   class __declspec(dllexport) xOleDateTime : public MemberBase  //COleDateTime对应c#类型?统一改为time_t
+    //  {
+    //   {
+    //      private:
+    //	       void AssignValue(const COleDateTime value);
+    //      public:
+    //	       xOleDateTime() { };
+    //         xOleDateTime(COleDateTime value) { AssignValue(value); };
+    //         COleDateTime value();
+    //         xOleDateTime operator=(const COleDateTime value) { AssignValue(value); return *this; };
+    //   };
+
+    public class xOleDateTimeSpan : MemberBase   //COleDateTimeSpan对应c#类型?TimeSpan?
+    {
+        public void AssignValue(TimeSpan value)        //因为c#无=重载,所以修改为public
+        {
+            m_sValue = value.ToString();
+        }
+        public xOleDateTimeSpan()
+        {
+            TimeSpan timeSpan = DateTime.Now - DateTime.Now;
+            AssignValue(timeSpan);
+        }
+        public xOleDateTimeSpan(TimeSpan value) { AssignValue(value); }
+
+        public TimeSpan value()
+        {
+            return TimeSpan.Parse(m_sValue);
+        }
+
+        //xOleDateTimeSpan operator=(const COleDateTimeSpan value) { AssignValue(value); return *this; };
+    };
+
+    public class xRect : MemberBase
+    {
+        public void AssignValue(Rect value, int shape = 1)        //因为c#无=重载,所以修改为public
+        {
+            //Rect x = new Rect();
+
+            // domain text body
+            string strDomainTextBody = "";
+            // value 1 -- shape
+            string strValue = "";
+
+            // value 2 -- center x
+            // domain center
+            int centerX = (int)(value.Left + value.Right) / 2;
+            strValue = centerX.ToString();
+
+            strDomainTextBody += strValue + ",";
+            // value 3 -- center y
+            int centerY = (int)(value.Top + value.Bottom) / 2;
+            strValue = centerY.ToString();
+            strDomainTextBody += strValue + ",";
+
+            if (shape == 0)
+            {
+                // value 4 -- diameter
+                int diameter = (int)value.Width;
+                strValue = diameter.ToString();
+                strDomainTextBody += strValue + ",";
+                // value 5 -- 0
+                strDomainTextBody += "0";
+            }
+            else
+            {
+                // value 4 -- width
+                int width = (int)value.Width;
+                strValue = width.ToString();
+                strDomainTextBody += strValue + ",";
+                // value 5 -- height
+                int height = (int)value.Width;
+                strValue = height.ToString();
+                strDomainTextBody += strValue;
+            }
+
+            // return domain text body
+            m_sValue = strDomainTextBody;
+        }
+
+        public xRect()  //xRect() { AssignValue(0); };???
+        {
+            Rect value = new Rect();
+            value.X = 0;
+            value.Y = 0;
+            value.Width = 1;
+            value.Height = 1;
+            AssignValue(value, 1);
+        }
+
+        xRect(Rect value, int shape) { AssignValue(value, shape); }
+
+        void SplitString(string s, ref List<string> v, string c)
+        {
+            string[] sArray = System.Text.RegularExpressions.Regex.Split(s, c, System.Text.RegularExpressions.RegexOptions.None);
+            foreach (string i in sArray)
+                v.Add(i);
+        }
+        public Rect value()
+        {
+            Rect rectangle = new Rect();
+            List<string> point = new List<string>();
+
+            SplitString(m_sValue, ref point, ",");
+
+            rectangle.X = int.Parse(point[0]);
+            rectangle.Y = int.Parse(point[1]);
+            rectangle.Width = Math.Abs(int.Parse(point[0]) + int.Parse(point[2]));
+            rectangle.Height = Math.Abs(int.Parse(point[1]) + int.Parse(point[3]));
+            return rectangle;
+        }
+    }
+
+    public class xPoint : MemberBase
+    {
+        public void AssignValue(System.Drawing.Point value)             //因为c#无=重载,所以修改为public
+        {
+            int X = value.Y;
+            int Y = value.Y;
+            string OutString;
+            string sX = X.ToString();
+            string sY = Y.ToString();
+            OutString = sX + "," + sY;
+            m_sValue = OutString;
+        }
+        xPoint()
+        {
+            System.Drawing.Point value = new System.Drawing.Point();
+            value.X = 0;
+            value.Y = 0;
+            AssignValue(value);
+        }
+        xPoint(System.Drawing.Point value) { AssignValue(value); }
+        void SplitString(string s, ref List<string> v, string c)
+        {
+            string[] sArray = System.Text.RegularExpressions.Regex.Split(s, c, System.Text.RegularExpressions.RegexOptions.None);
+            foreach (string i in sArray)
+                v.Add(i);
+        }
+        System.Drawing.Point value()
+        {
+            System.Drawing.Point p = new System.Drawing.Point();
+            List<string> point = new List<string>();
+            SplitString(m_sValue, ref point, ",");
+
+            p.X = int.Parse(point[0]);
+            p.Y = int.Parse(point[1]);
+
+            return p;
+        }
+
+    };
+
+
+    //typedef std::map<std::string, CollectionBase*>::iterator __declspec(dllexport) CollectionIterator;  ???
+    public abstract class CollectionBase<T> 
+    {
+        private string m_sCollectionName;
+        private string m_sCollectionClassType;
+        public CollectionBase() { m_sCollectionName = ""; m_sCollectionClassType = ""; }
+        public List<ISlo> m_vCollection = new List<ISlo>(); //vector<ISlo*> m_vCollection;  ISlo*转??
+
+        public SortedDictionary<ISlo, bool> m_mOwner = new SortedDictionary<ISlo, bool>();   //map<ISlo*, bool> ??
+        public void setCollectionName(string value) { m_sCollectionName = value; }
+        public void setCollectionClassType(string value) { m_sCollectionClassType = value; }
+        public abstract T newElement();
+        public string getCollectionName() { return m_sCollectionName; }
+        public int size() { return m_vCollection.Count(); }
+        public ISlo getItem(int itemID) { return m_vCollection[itemID]; }
+        public void Clear()
+        {
+            if (m_vCollection.Count() > 0)
+            {
+                m_vCollection.Clear();
+            }
+        }
+    }
+
+    public class Collection<T> : CollectionBase<T>
+    {
+        /**
+        create new element of type T
+        @return empty object of type T
+        */
+        public override T newElement() 
+        {
+            T newItem = System.Activator.CreateInstance<T>();
+            //T newItem = default(T);
+            object temp = newItem;
+            ISlo sIo = (ISlo)temp;
+
+            //Slo sIo = new Slo();
+            m_vCollection.Add(sIo);
+            //I change this value to be false forever(gsp).No matter what case there's no need to set the object's owner to the collection
+            //after we created the object we'll put them to in a smartpointer.then the smartpointer will manage it.
+            //m_mOwner[sIo] = false;//m_mOwner[newItem]=true 
+            Type type = newItem.GetType();
+            return newItem;
+        }
+
+        public void addItem(T item)
+        {
+            object temp = item;
+            ISlo sIo = (ISlo)temp;
+            m_vCollection.Add(sIo);/* m_mOwner[item] = false;*/
+        }
+
+        public T getItem(int itemID) 
+        {
+            object temp = m_vCollection[itemID];
+            T item = (T)temp;
+            return item;
+        }
+    };
+
+    public abstract class ISlo : Convertinterface
+    {
+        public abstract void Serialize(bool isStoring, XmlDocument xml, XmlNode rootNode);
+
+        //virtual ~ISlo() = default;
+    }
+
+    //typedef std::vector<Slo*>::iterator  __declspec(dllexport) SerializableIterator;  //iterator?
+
+    public class Slo<T>: ISlo
+    {
+        //private (Slo const &s) { }
+        //private Slo operator=(Slo const &s) { return *this; };
+
+        public string strReplaceAll(string source, string searchFor, string replaceWith)
+        {
+            if ((searchFor == null) || (searchFor == ""))
+            {
+                return source;
+            }
+            source.Replace(searchFor, replaceWith);
+            return source;
+        }
+
+        public string m_sXML;
+        public string m_sClassName;
+        public string m_sVersion;
+        public SortedDictionary<string, MemberBase> m_AttributeMappings = new SortedDictionary<string, MemberBase>();
+        public SortedDictionary<string, ISlo> m_MemberMappings=new SortedDictionary<string, ISlo>();
+        public SortedDictionary<string, CollectionBase<T>> m_MemberCollections=new SortedDictionary<string, CollectionBase<T>>();
+
+        public void setClassName(string ClassName) { m_sClassName = ClassName; }
+        public Slo()
+        {
+            m_sClassName = null;
+            m_sVersion = null;
+            m_sXML = null;
+            m_AttributeMappings.Clear();
+            m_MemberMappings.Clear();
+            m_MemberCollections.Clear();
+        }
+
+        /**
+         Register a member
+         @MemberName XML-Description/Name for the member
+         @Member Member to register
+         @return void
+        */
+        public void Register(string MemberName, MemberBase Member)  // public void Register(string MemberName, MemberBase Member, string DefaultValue)  DefaultValue无引用,c#无自动补充功能,故方法调整为双参数
+        {
+            m_AttributeMappings[MemberName] = Member;
+        }
+
+        /**
+        Register a member-subclass
+        @MemberName XML-Description/Name for the member-class
+        @Member Member-class to register
+        @return void
+        */
+        public void Register(string MemberName, ISlo Member)
+        {
+            m_MemberMappings[MemberName] = Member;
+        }
+
+        /**
+         Register a class-collection
+         @CollectionName XML-Description/Name for the collection
+         @SubclassCollection Collection to register
+         @return void
+        */
+        public void Register(string CollectionName, CollectionBase<T> SubclassCollection)
+        {
+            SubclassCollection.setCollectionName(CollectionName);
+            m_MemberCollections[CollectionName] = SubclassCollection;
+        }
+
+
+        public override void Serialize(bool isStoring, XmlDocument xml, XmlNode rootNode)
+        {
+            if (isStoring)
+            {
+                if (xml.DocumentElement != null)
+                {
+                    toXML(xml, rootNode);
+                }
+            }
+            else
+            {
+                fromXML(xml, rootNode);
+            }
+        }
+        public void toXML(XmlDocument xml, XmlNode rootNode)
+        {
+            //XmlNode rootNode = xml.SelectSingleNode("XMLData");
+
+            //for (auto it_member = m_AttributeMappings.begin(); it_member != m_AttributeMappings.end(); ++it_member)
+            //{
+            //    rootNode->SetAttribute(it_member->first.c_str(), it_member->second->c_str());
+            //}
+            for (int it_member = 0; it_member < m_AttributeMappings.Count; it_member++)
+            {
+                var element = m_AttributeMappings.ElementAt(it_member);
+                
+                if (rootNode.Attributes[element.Key] == null)
+                {
+                    XmlElement XmlEle = (XmlElement)rootNode;
+                    XmlEle.SetAttribute(element.Key, element.Value.toString());
+                }
+                else
+                {
+                    rootNode.Attributes[element.Key].InnerText = element.Value.toString();
+                }
+            }
+            //XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
+
+            //for (auto it_subclass = m_MemberMappings.begin(); it_subclass != m_MemberMappings.end(); ++it_subclass)
+            //{
+            //    ISlo* subMember = it_subclass->second;
+            //    tinyxml2::XMLElement* subClassNode = classDoc->NewElement("Member");
+            //    subClassNode->SetAttribute("RegName", it_subclass->first.c_str());
+            //    rootNode->InsertEndChild(subClassNode);
+            //    subMember->Serialize(true, classDoc, subClassNode);
+            //}
+
+            for (int it_subclass = 0; it_subclass < m_MemberMappings.Count; it_subclass++)
+            {
+                var element = m_MemberMappings.ElementAt(it_subclass);
+                ISlo subMember = element.Value;
+                XmlNode subClassNode = xml.CreateElement("Member");
+                rootNode.AppendChild(subClassNode);
+
+                //if (rootNode.Attributes["RegName"] == null)
+                //{
+                //    XmlElement XmlEle_subclass = (XmlElement)rootNode;
+                //    XmlEle_subclass.SetAttribute("RegName", element.Key);
+                //}
+                //else
+                //{
+                //    subClassNode.Attributes["RegName"].InnerText = element.Key;
+                //}
+
+                XmlElement XmlEle = (XmlElement)subClassNode;
+                XmlEle.SetAttribute("RegName", element.Key);
+                subMember.Serialize(true, xml, subClassNode);
+            }
+
+
+            //for (CollectionIterator it_collection = m_MemberCollections.begin(); it_collection != m_MemberCollections.end(); ++it_collection)
+            //{
+            //    tinyxml2::XMLElement* listNode = classDoc->NewElement("Collection");
+            //    listNode->SetAttribute("RegName", (*it_collection).second->getCollectionName().c_str());
+            //    for (size_t c = 0; c < (*it_collection).second->size(); c++)
+            //    {
+            //        ISlo* item = (*it_collection).second->getItem(c);
+            //        tinyxml2::XMLElement* elementNode = classDoc->NewElement("Member");
+            //        item->Serialize(true, classDoc, elementNode);
+            //        listNode->InsertEndChild(elementNode);
+            //    }
+            //    rootNode->InsertEndChild(listNode);
+            //}
+
+            for (int it_collection = 0; it_collection < m_MemberCollections.Count; it_collection++)
+            {
+                var element = m_MemberCollections.ElementAt(it_collection);
+                XmlNode listNode = xml.CreateElement("Collection");
+                XmlElement XmlEle = (XmlElement)listNode;
+                XmlEle.SetAttribute("RegName", element.Value.getCollectionName());
+                for (int c = 0; c < element.Value.size(); c++)
+                {
+                    ISlo item = element.Value.getItem(c);
+                    XmlNode elementNode = xml.CreateElement("Member");
+                    item.Serialize(true, xml, elementNode);
+                    listNode.AppendChild(elementNode);
+                }
+
+                rootNode.AppendChild(listNode);
+            }
+        }
+
+        public void fromXML(XmlDocument xml, XmlNode rootNode)
+        {
+
+            //for (var it = this.m_AttributeMappings.First(); it != this.m_AttributeMappings.Last(); ++it)
+            //{
+            //    if (rootNode->Attribute(it->first.c_str()))
+            //    {
+            //        *(it->second->getStringPtr()) = rootNode->Attribute(it->first.c_str());// *(*it)->getField() = memberNode->GetText();
+            //    }
+            //}
+            for (int count = 0; count < m_AttributeMappings.Count; count++)
+            {
+                var element = m_AttributeMappings.ElementAt(count);
+                if (rootNode.Attributes[element.Key] != null)
+                {
+                    string aa = rootNode.Attributes[element.Key].Value;
+                    element.Value.getStringPtr(rootNode.Attributes[element.Key].Value);
+                }
+            }
+
+            //tinyxml2::XMLElement* classNode = rootNode->FirstChildElement("Member");
+            //while (classNode != NULL)
+            //{
+            //    std::string className = classNode->Attribute("RegName");
+            //    for (auto it_subclass = this->m_MemberMappings.begin(); it_subclass != this->m_MemberMappings.end(); ++it_subclass)
+            //    {
+            //        if (it_subclass->first == className)
+            //        {
+            //            it_subclass->second->Serialize(false, classDoc, classNode);
+            //            break;
+            //        }
+            //    }
+            //    classNode = classNode->NextSiblingElement("Member");
+            //}
+
+            XmlNodeList classNodeList = rootNode.SelectNodes("Member");
+            if (classNodeList.Count != 0)
+            {
+                for (int i = 0; i < classNodeList.Count; i++)
+                {
+                    string className = classNodeList[i].Attributes["RegName"].Value;
+                    for (int count = 0; count < m_MemberMappings.Count; count++)
+                    {
+                        var element = m_MemberMappings.ElementAt(count);
+                        if (element.Key == className)
+                        {
+                            element.Value.Serialize(false, xml, classNodeList[i]);
+                            break;
+                        }
+                    }
+                }
+            }
+
+            //tinyxml2::XMLElement* collectionNode = rootNode->FirstChildElement("Collection");
+            //while (collectionNode != NULL)
+            //{
+            //    std::string collectionName = collectionNode->Attribute("RegName");
+            //    for (CollectionIterator it_collection = this->m_MemberCollections.begin(); it_collection != this->m_MemberCollections.end(); ++it_collection)
+            //    {
+            //        if ((*it_collection).second->getCollectionName() == collectionName)
+            //        {
+            //            (*it_collection).second->Clear();
+            //            tinyxml2::XMLElement* classNode = collectionNode->FirstChildElement("Member");
+            //            while (classNode != NULL)
+            //            {
+            //                ISlo* newItem = (*it_collection).second->newElement();
+            //                newItem->Serialize(false, classDoc, classNode);
+            //                classNode = classNode->NextSiblingElement("Member");
+            //            }
+            //        }
+            //    }
+            //    collectionNode = collectionNode->NextSiblingElement("Collection");
+            //}
+            //}
+
+            XmlNodeList collectionNodeList = rootNode.SelectNodes("Collection");
+            if (collectionNodeList.Count != 0)
+            {
+                for (int i = 0; i < collectionNodeList.Count; i++)
+                {
+                    string collectionName = collectionNodeList[i].Attributes["RegName"].Value;
+
+                    for (int count = 0; count < m_MemberCollections.Count; count++)
+                    {
+                        var element = m_MemberCollections.ElementAt(count);
+                        if (element.Value.getCollectionName() == collectionName)
+                        {
+                            element.Value.Clear();
+                            XmlNodeList classNode2List = collectionNodeList[i].SelectNodes("Member");
+                            if (classNode2List.Count != 0)
+                            {
+                                for (int j = 0; j < classNode2List.Count; j++)
+                                {
+                                    Convertinterface newItem = (Convertinterface)element.Value.newElement();
+                                    //ISlo newItem = element.Value.newElement();
+                                    //Object objectItem = element.Value.newElement();
+                                    //ISlo newItem = (ISlo)objectItem;
+
+                                    //newItem.m_AttributeMappings = m_AttributeMappings;
+                                    //newItem.m_MemberMappings = m_MemberMappings;
+                                    //newItem.m_MemberCollections = m_MemberCollections;
+
+                                    newItem.Serialize(false, xml, classNode2List[j]);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        string IdentifyClass(XmlNode rootNode, string XMLSource)  
+        {
+            return rootNode.Attributes["RegName"].Value;
+        }
+
+        string IdentifyClassVersions(XmlNode rootNode, string XMLSource)  //同 IdentifyClass ???
+        {
+            return rootNode.Attributes["RegName"].Value;
+        }
+
+
+        public string getClassName() { return m_sClassName; }
+        public void setVersion(string value) { m_sVersion = value; }
+        public string getVersion() { return m_sVersion; }
+
+        public void Clear()
+        {
+            m_AttributeMappings.Clear();
+            m_MemberMappings.Clear();
+            m_MemberCollections.Clear();
+        }
+    }
+}

+ 2 - 0
FileManager/XmlManager.cs

@@ -6,6 +6,8 @@ using System.Threading.Tasks;
 
 using System.Xml;
 using System.IO;
+using MeasureData;
+using System.Reflection;
 
 namespace FileManager
 {

+ 28 - 1
MeasureData/CutHole.cs

@@ -7,6 +7,9 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
+using FileManager;
+using System.Xml;
+
 namespace MeasureData
 {
     
@@ -40,7 +43,7 @@ namespace MeasureData
     }
 
     //切割孔
-    public class CutHole
+    public class CutHole: Convertinterface
     {
         #region 样品名
         /// <summary>
@@ -158,6 +161,30 @@ namespace MeasureData
         }
 
         //样品孔存储xml文档
+        public void Serialize(bool isStoring, XmlDocument xml, XmlNode rootNode)
+        {
+
+            Slo<CutHole> slo = new Slo<CutHole> ();
+
+            xString SampleName = new xString();
+            SampleName.AssignValue(this.SampleName);
+            slo.Register("SampleName", SampleName);
+            
+
+            if (isStoring)
+            {
+                slo.Serialize(true, xml, rootNode);
+            }
+            else
+            {
+                slo.Serialize(false, xml, rootNode);
+
+                this.SampleName = SampleName.value();
+               
+
+            }
+        }
+    
     }
 
 }

+ 4 - 0
MeasureData/MeasureData.csproj

@@ -32,6 +32,10 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="FileManager, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\Debug\FileManager.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />

+ 29 - 1
MeasureData/MeasureFile.cs

@@ -7,9 +7,12 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
+using FileManager;
+using System.Xml;
+
 namespace MeasureData
 {
-    public class MeasureFile
+    public class MeasureFile:Convertinterface
     {
         #region 内容
         //文件名
@@ -40,6 +43,30 @@ namespace MeasureData
         }
 
         //XML文件保存
+        //样品孔存储xml文档
+        public void Serialize(bool isStoring, XmlDocument xml, XmlNode rootNode)
+        {
+
+            Slo<CutHole> slo = new Slo<CutHole>();
+
+            xString FileName = new xString();
+            FileName.AssignValue(this.FileName);
+            slo.Register("FileName", FileName);
+
+
+            if (isStoring)
+            {
+                slo.Serialize(true, xml, rootNode);
+            }
+            else
+            {
+                slo.Serialize(false, xml, rootNode);
+
+                this.FileName = FileName.value();
+
+
+            }
+        }
         #endregion
 
         //构造函数
@@ -66,6 +93,7 @@ namespace MeasureData
         //保存
         public void Save()
         {
+            //Serialize();
         }
 
         //另存为

+ 32 - 0
SmartSEMControl/HardwareInterface.cs

@@ -48,10 +48,18 @@ namespace SmartSEMControl
         float GetMagnification();
         Boolean SetMagnification(float set);
 
+        //FIB缩放
+        float GetFIBMagnification();
+        Boolean SetFIBMagnification(float set);
+
         //焦距
         float GetWorkingDistance();
         Boolean SetWorkingDistance(float set);
 
+        //FIB焦距
+        float GetFIBObjectivePotential();
+        Boolean SetFIBObjectivePotential(float set);
+
         //自动对焦
         Boolean CmdAutoFocusCoarse();
         Boolean CmdAutoFocusFine();
@@ -77,6 +85,12 @@ namespace SmartSEMControl
         Boolean SetAstigmatismX(float set);
         Boolean SetAstigmatismY(float set);
 
+        //FIB消像散
+        float GetFIBAstigmatismX();
+        float GetFIBAstigmatismY();
+        Boolean SetFIBAstigmatismX(float set);
+        Boolean SetFIBAstigmatismY(float set);
+
         //自动消像散
         Boolean CmdAutoStig();
 
@@ -119,11 +133,26 @@ namespace SmartSEMControl
         //像素读取PixelSize
         float GetPixelSize();
 
+        //电子束移动接口
+        float GetBeamShiftX();
+        float GetBeamShiftY();
+        Boolean SetBeamShiftX(float set);
+        Boolean SetBeamShiftY(float set);
+
+        //FIB电子束移动接口
+        float GetFIBBeamShiftX();
+        float GetFIBBeamShiftY();
+        Boolean SetFIBBeamShiftX(float set);
+        Boolean SetFIBBeamShiftY(float set);
+
         //电子束校正设置
         float GetTiltCorrection();
         Boolean SetTiltCorrectionOff();
         Boolean SetTiltCorrectionOn();
 
+        //读取FIB模式
+        float GetFIBMode();
+
         //开启电压
         Boolean CmdOpenVoltage();
 
@@ -148,6 +177,9 @@ namespace SmartSEMControl
         //清除控件
         Boolean Dispose();
 
+
+
+
         //Pt的控制
         //PT针插入
         void InsertPT();

+ 290 - 5
SmartSEMControl/SmartSEM.cs

@@ -67,6 +67,19 @@ namespace SmartSEMControl
         private String AP_STAGE_AT_R = "AP_STAGE_AT_R";
         //M轴坐标
         private String AP_STAGE_AT_M = "AP_STAGE_AT_M";
+
+        //FIB缩放
+        private String AP_FIB_MAGNIFICATION = "AP_FIB_MAGNIFICATION";
+        //FIB焦距
+        private String AP_FIB_OBJECTIVE_POTENTIAL = "AP_FIB_OBJECTIVE_POTENTIAL";
+        //FIB消像散X
+        private String AP_FIB_STIGMATOR_X = "AP_FIB_STIGMATOR_X";
+        //FIB消像散Y
+        private String AP_FIB_STIGMATOR_Y = "AP_FIB_STIGMATOR_Y";
+        //FIB光束移动X
+        private String AP_FIB_BEAM_SHIFT_X = "AP_FIB_BEAM_SHIFT_X";
+        //FIB光束移动Y
+        private String AP_FIB_BEAM_SHIFT_Y = "AP_FIB_BEAM_SHIFT_Y";
         #endregion
 
         #region 数字参数
@@ -86,7 +99,10 @@ namespace SmartSEMControl
         //样品台状态
         private String DP_STAGE_IS = "DP_STAGE_IS";
         //自动函数状态
-        private String DP_AUTO_FUNCTION = "DP_AUTO_FUNCTION";        
+        private String DP_AUTO_FUNCTION = "DP_AUTO_FUNCTION";
+
+        //FIB模式
+        private String DP_FIB_MODE = "DP_FIB_MODE";
         #endregion
 
         #region 命令
@@ -102,6 +118,18 @@ namespace SmartSEMControl
         private String CMD_AUTO_STIG = "CMD_AUTO_STIG";
         //样品台急停
         private String CMD_STAGE_ABORT = "CMD_STAGE_ABORT";
+        //FIB模式选择
+        private String CMD_FIB_MODE_SEM = "CMD_FIB_MODE_SEM";
+        private String CMD_FIB_MODE_FIB = "CMD_FIB_MODE_FIB";
+        private String CMD_FIB_MODE_MILL = "CMD_FIB_MODE_MILL";
+        private String CMD_FIB_MODE_SEM_FIB = "CMD_FIB_MODE_SEM_FIB";
+        private String CMD_FIB_MODE_MILL_SEM = "CMD_FIB_MODE_MILL_SEM";
+        private String CMD_FIB_MODE_EXT = "CMD_FIB_MODE_EXT";
+        private String CMD_FIB_MODE_EXT_SEM = "CMD_FIB_MODE_EXT_SEM";
+        private String CMD_FIB_MODE_ARGON_SEM = "CMD_FIB_MODE_ARGON_SEM";
+        private String CMD_FIB_MODE_DRIFT_SEM = "CMD_FIB_MODE_DRIFT_SEM";
+        private String CMD_FIB_MODE_DRIFT_FIB = "CMD_FIB_MODE_DRIFT_FIB";
+        private String CMD_FIB_MODE_ARGON = "CMD_FIB_MODE_ARGON";
         #endregion
 
         #region 宏文件命令
@@ -302,7 +330,7 @@ namespace SmartSEMControl
         }
         #endregion
 
-        #region 放大缩小
+        #region SEM缩
         /// <summary>
         /// 读取缩放倍数
         /// </summary>
@@ -331,7 +359,7 @@ namespace SmartSEMControl
         }
         #endregion
 
-        #region 焦距
+        #region SEM焦距
         /// <summary>
         /// 读取工作距离
         /// </summary>
@@ -520,7 +548,7 @@ namespace SmartSEMControl
         }
         #endregion
 
-        #region 消像散
+        #region SEM消像散
         /// <summary>
         /// 读取消像散X
         /// </summary>
@@ -731,7 +759,7 @@ namespace SmartSEMControl
         }
         #endregion
 
-        #region 电子束移动接口
+        #region SEM电子束移动接口
         /// <summary>
         /// 获取电子束移动接口X
         /// </summary>
@@ -1208,6 +1236,263 @@ namespace SmartSEMControl
         }
         #endregion
 
+        #region FIB缩放
+        /// <summary>
+        /// 读取缩放倍数
+        /// </summary>
+        /// <returns>true:float or false:NaN</returns>
+        public float GetFIBMagnification()
+        {
+            float ret = 0;
+            if (ReadParams(AP_FIB_MAGNIFICATION, ref ret))
+            {
+                return ret;
+            }
+            else
+            {
+                return float.NaN;
+            }
+        }
+
+        /// <summary>
+        /// 设置缩放倍数
+        /// </summary>
+        /// <param name="set">倍数</param>
+        /// <returns>true or false</returns>
+        public Boolean SetFIBMagnification(float set)
+        {
+            return WriteParams(AP_FIB_MAGNIFICATION, set);
+        }
+        #endregion
+
+        #region FIB焦距
+        /// <summary>
+        /// 读取工作距离AP_FIB_OBJECTIVE_POTENTIAL
+        /// </summary>
+        /// <returns>true:float or false:NaN</returns>
+        public float GetFIBObjectivePotential()
+        {
+            float ret = 0;
+            if (ReadParams(AP_FIB_OBJECTIVE_POTENTIAL, ref ret))
+            {
+                return ret;
+            }
+            else
+            {
+                return float.NaN;
+            }
+        }
+
+        /// <summary>
+        /// 设置焦距
+        /// </summary>
+        /// <param name="set">焦距</param>
+        /// <returns>true or false</returns>
+        public Boolean SetFIBObjectivePotential(float set)
+        {
+            return WriteParams(AP_FIB_OBJECTIVE_POTENTIAL, set);
+        }
+        #endregion  
+
+        #region FIB消像散
+        /// <summary>
+        /// 读取消像散X
+        /// </summary>
+        /// <returns>true:float or false:NaN</returns>
+        public float GetFIBAstigmatismX()
+        {
+            float ret = 0;
+            if (ReadParams(AP_FIB_STIGMATOR_X, ref ret))
+            {
+                return ret;
+            }
+            else
+            {
+                return float.NaN;
+            }
+        }
+
+        /// <summary>
+        /// 读取消像散Y
+        /// </summary>
+        /// <returns>true:float or false:NaN</returns>
+        public float GetFIBAstigmatismY()
+        {
+            float ret = 0;
+            if (ReadParams(AP_FIB_STIGMATOR_Y, ref ret))
+            {
+                return ret;
+            }
+            else
+            {
+                return float.NaN;
+            }
+        }
+
+        /// <summary>
+        /// 设置消像散X
+        /// </summary>
+        /// <param name="set">对比度</param>
+        /// <returns>true or false</returns>
+        public Boolean SetFIBAstigmatismX(float set)
+        {
+            return WriteParams(AP_FIB_STIGMATOR_X, set);
+        }
+
+        /// <summary>
+        /// 设置消像散Y
+        /// </summary>
+        /// <param name="set">对比度</param>
+        /// <returns>true or false</returns>
+        public Boolean SetFIBAstigmatismY(float set)
+        {
+            return WriteParams(AP_FIB_STIGMATOR_Y, set);
+        }
+        #endregion
+
+        #region FIB电子束移动接口
+        /// <summary>
+        /// 获取电子束移动接口X
+        /// </summary>
+        /// <returns>true:float or false:NaN</returns>
+        public float GetFIBBeamShiftX()
+        {
+            float ret = 0;
+            if (ReadParams(AP_FIB_BEAM_SHIFT_X, ref ret))
+            {
+                return ret;
+            }
+            else
+            {
+                return float.NaN;
+            }
+        }
+
+        /// <summary>
+        /// 获取电子束移动接口Y
+        /// </summary>
+        /// <returns>true:float or false:NaN</returns>
+        public float GetFIBBeamShiftY()
+        {
+            float ret = 0;
+            if (ReadParams(AP_FIB_BEAM_SHIFT_Y, ref ret))
+            {
+                return ret;
+            }
+            else
+            {
+                return float.NaN;
+            }
+        }
+
+        /// <summary>
+        /// 设置电子束移动接口X
+        /// </summary>
+        /// <param name="set">X坐标</param>
+        /// <returns>true or false</returns>
+        public Boolean SetFIBBeamShiftX(float set)
+        {
+            return WriteParams(AP_FIB_BEAM_SHIFT_X, set);
+        }
+
+        /// <summary>
+        /// 设置电子束移动接口Y
+        /// </summary>
+        /// <param name="set">X坐标</param>
+        /// <returns>true or false</returns>
+        public Boolean SetFIBBeamShiftY(float set)
+        {
+            return WriteParams(AP_FIB_BEAM_SHIFT_Y, set);
+        }
+        #endregion
+
+        #region FIB模式
+        /// <summary>
+        /// 获取FIB模式
+        /// </summary>
+        /// <returns>true:float or false:NaN</returns>
+        public float GetFIBMode()
+        {
+            float ret = 0;
+            if (ReadParams(DP_FIB_MODE, ref ret))
+            {
+                return ret;
+            }
+            else
+            {
+                return float.NaN;
+            }
+        }
+        #endregion
+
+        #region FIB模式选择
+        //SEM模式
+        public Boolean CmdFIBModeSEM()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_SEM);
+        }
+
+        //FIB模式
+        public Boolean CmdFIBModeFIB()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_FIB);
+        }
+
+        //铣削模式
+        public Boolean CmdFIBModeMILL()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_MILL);
+        }
+
+        //SEM+FIB模式
+        public Boolean CmdFIBModeSEMAndFIB()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_SEM_FIB);
+        }
+
+        //铣削+SEM模式
+        public Boolean CmdFIBModeMILLAndSEM()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_MILL_SEM);
+        }
+
+        //EXT模式
+        public Boolean CmdFIBModeEXT()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_EXT);
+        }
+
+        //EXT+SEM模式
+        public Boolean CmdFIBModeEXTAndSEM()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_EXT_SEM);
+        }
+
+        //Argon(氩)+SEM模式
+        public Boolean CmdFIBModeARGONAndSEM()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_ARGON_SEM);
+        }
+
+        //DRIFT(流)+SEM模式
+        public Boolean CmdFIBModeDRIFTAndSEM()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_DRIFT_SEM);
+        }
+
+        //DRIFT(流)+FIB模式
+        public Boolean CmdFIBModeDRIFTAndFIB()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_DRIFT_FIB);
+        }
+
+        //Argon(氩)模式
+        public Boolean CmdFIBModeARGON()
+        {
+            return ExecuteCmd(CMD_FIB_MODE_ARGON);
+        }
+        #endregion
+
         public void InsertPT()
         {
         }