From 4925d9d4a1f0e0f2ba4f166f6ed70009b84b1e41 Mon Sep 17 00:00:00 2001 From: shenjianxing <”315615051@qq.com“> Date: Wed, 18 Dec 2024 16:20:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A8=A1=E5=9D=97xml?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Actions/ActionHelper.cs | 8 + Assets/Scripts/Actions/LoadResAction.cs | 103 ++ Assets/Scripts/Actions/LoadResAction.cs.meta | 11 + .../Scripts/Controller/PreLoadController.cs | 16 + .../Controller/PreLoadController.cs.meta | 11 + Assets/Scripts/Global/Global.cs | 1 + Assets/Scripts/Launch.cs | 14 +- Assets/Scripts/Xml/XmlParser.cs | 258 +++-- Data/App.xml | 22 +- Data/Xml/Pig.xml | 929 ++++++++++++++++++ Doc/Xml配置文档.xml | 2 +- 11 files changed, 1264 insertions(+), 111 deletions(-) create mode 100644 Assets/Scripts/Actions/LoadResAction.cs create mode 100644 Assets/Scripts/Actions/LoadResAction.cs.meta create mode 100644 Assets/Scripts/Controller/PreLoadController.cs create mode 100644 Assets/Scripts/Controller/PreLoadController.cs.meta create mode 100644 Data/Xml/Pig.xml diff --git a/Assets/Scripts/Actions/ActionHelper.cs b/Assets/Scripts/Actions/ActionHelper.cs index 67a6beb7..b2d84b44 100644 --- a/Assets/Scripts/Actions/ActionHelper.cs +++ b/Assets/Scripts/Actions/ActionHelper.cs @@ -164,6 +164,14 @@ public class ActionHelper var strAction = (XMLTool.StringListAction)act; return HighLightAction.Allocate(act.Value, strAction.args[0], strAction.args[1]); } + case "LoadRes": + { + var strAction = (XMLTool.StringListAction)act; + return LoadResAction.Allocate(act.Value, strAction.args[0]); + } + default: + Debug.LogError($"ûҵAction{act.Type}"); + break; } break; case XMLTool.Condition condition: diff --git a/Assets/Scripts/Actions/LoadResAction.cs b/Assets/Scripts/Actions/LoadResAction.cs new file mode 100644 index 00000000..6abbe2e9 --- /dev/null +++ b/Assets/Scripts/Actions/LoadResAction.cs @@ -0,0 +1,103 @@ +using System; +using System.Data.SqlTypes; +using System.Xml.Linq; +using UnityEngine; +using XMLTool; + +namespace QFramework +{ + internal class LoadResAction : IAction + { + + + public System.Action OnFinished { get; set; } + + + private LoadResAction() + { + } + + private static readonly SimpleObjectPool mPool = + new SimpleObjectPool(() => new LoadResAction(), null, 10); + + string fileName; + string type; + public static LoadResAction Allocate(string fileName, string type, System.Action OnFinished = null) + { + var retNode = mPool.Allocate(); + retNode.ActionID = ActionKit.ID_GENERATOR++; + retNode.Deinited = false; + retNode.Reset(); + retNode.fileName = fileName; + retNode.type = type; + retNode.OnFinished = OnFinished; + return retNode; + } + + + public ulong ActionID { get; set; } + public ActionStatus Status { get; set; } + + public void OnStart() + { + ResLoader resLoader = ResLoader.Allocate(); + string path = Global.xmlPath + fileName; + switch (type) + { + case "xml": + resLoader.Add2Load(path.ToLocalTextResName(), (success, res) => + { + if (success) + { + string xmlStr = res.Asset.As().text; + if (string.IsNullOrEmpty(xmlStr) == false) + { + // XML + XDocument doc = XDocument.Parse(xmlStr); + // ȡԪ + XElement moduleXml = doc.Root; + XmlParser.LoadModule(moduleXml, Global.Instance.appData); + } + } + }); + break; + } + + resLoader.LoadAsync(() => + { + resLoader.Recycle2Cache(); + this.Finish(); + }); + } + + public void OnExecute(float dt) + { + } + + public void OnFinish() + { + } + + public void Reset() + { + Status = ActionStatus.NotStart; + Paused = false; + } + + public bool Paused { get; set; } + + public void Deinit() + { + if (!Deinited) + { + OnFinished = null; + Deinited = true; + mPool.Recycle(this); + } + } + + public bool Deinited { get; set; } + } + + +} \ No newline at end of file diff --git a/Assets/Scripts/Actions/LoadResAction.cs.meta b/Assets/Scripts/Actions/LoadResAction.cs.meta new file mode 100644 index 00000000..cf9602fa --- /dev/null +++ b/Assets/Scripts/Actions/LoadResAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c2b87ed3cbc0554d8644f0ae736cc6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Controller/PreLoadController.cs b/Assets/Scripts/Controller/PreLoadController.cs new file mode 100644 index 00000000..e511c9f5 --- /dev/null +++ b/Assets/Scripts/Controller/PreLoadController.cs @@ -0,0 +1,16 @@ +using QFramework; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class PreLoadController : MonoSingleton +{ + + public ResLoader resLoader => ResLoader.Allocate(); + + + + + + +} diff --git a/Assets/Scripts/Controller/PreLoadController.cs.meta b/Assets/Scripts/Controller/PreLoadController.cs.meta new file mode 100644 index 00000000..69cd817a --- /dev/null +++ b/Assets/Scripts/Controller/PreLoadController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b7e736c25d5d0de44967b40031251f32 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Global/Global.cs b/Assets/Scripts/Global/Global.cs index 65d4d99a..dee5fd55 100644 --- a/Assets/Scripts/Global/Global.cs +++ b/Assets/Scripts/Global/Global.cs @@ -18,6 +18,7 @@ public class Global : Singleton public static string appXmlPath = dataPath + "/App.xml"; public static string imagePath = dataPath + "/Image/"; public static string videoPath = dataPath + "/Video/"; + public static string xmlPath = dataPath + "/Xml/"; public static APPSetting appSetting { get; } = new APPSetting(); public enum AppType diff --git a/Assets/Scripts/Launch.cs b/Assets/Scripts/Launch.cs index d9752ff7..7521b905 100644 --- a/Assets/Scripts/Launch.cs +++ b/Assets/Scripts/Launch.cs @@ -18,7 +18,7 @@ public class Launch : MonoBehaviour IEnumerator StartApp() { yield return ResKit.InitAsync(); - + bool isLoadFinished = false; loader.Add2Load(Global.appXmlPath.ToLocalTextResName(), (success, res) => { if (success) @@ -29,13 +29,20 @@ public class Launch : MonoBehaviour loader.LoadAsync(() => { + isLoadFinished = true; ActionKit.Delay(2f, () => { loader.Recycle2Cache(); loader = null; }); }); + + yield return UIKit.OpenPanelAsync(); + yield return new WaitUntil(() => isLoadFinished == true); + yield return ActionHelper.GetActionAndSub(Global.Instance.appData.preLoad.action).Start(this); yield return UIKit.OpenPanelAsync(); + UIKit.HidePanel(); + // ʱ //foreach (var item in Global.Instance.appData.ActionDict) @@ -45,5 +52,10 @@ public class Launch : MonoBehaviour //} } + + IEnumerator PreLoad() + { + yield return null; + } } diff --git a/Assets/Scripts/Xml/XmlParser.cs b/Assets/Scripts/Xml/XmlParser.cs index 0dda1e7f..138ab976 100644 --- a/Assets/Scripts/Xml/XmlParser.cs +++ b/Assets/Scripts/Xml/XmlParser.cs @@ -1,7 +1,9 @@ +using MoonSharp.Interpreter.CoreLib; using QFramework; using System; using System.Collections.Generic; using System.Linq; +using System.Net.Configuration; using System.Xml; using System.Xml.Linq; using UnityEngine; @@ -10,9 +12,15 @@ namespace XMLTool { public class AppData { + public PreLoad preLoad; public List Modules { get; set; } } + public class PreLoad + { + public Action action; + } + public class Module { @@ -133,139 +141,164 @@ namespace XMLTool // ʼAppData AppData appData = new AppData { + preLoad = new PreLoad(), Modules = new List(), }; - // ȡģԪ + + // Ԥض + var preLoadElement = appDataElement.Element("PreLoad"); + foreach (XElement actionElement in preLoadElement.Elements("Action")) + { + var action = ParseAction(actionElement); + appData.preLoad.action = action; + } + + // ģ + LoadModules(appDataElement, appData); + + return appData; + } + + + + + public static void LoadModules(XElement appDataElement, AppData appData) + { + foreach (XElement moduleElement in appDataElement.Elements("Module")) { - if (moduleElement != null) + LoadModule(moduleElement, appData); + } + } + + public static void LoadModule(XElement moduleElement, AppData appData) + { + if (moduleElement != null) + { + Module module = new Module() { - Module module = new Module() + Devices = new List(), + ActionDict = new Dictionary(), + Operations = new List(), + }; + appData.Modules.Add(module); + // ģ + module.type = moduleElement.Element("Type")?.Value; + module.ModuleName = moduleElement.Element("Name")?.Value; + module.Scene = moduleElement.Element("Scene")?.Value; + + // 豸 + foreach (XElement deviceElement in moduleElement.Elements("Device")) + { + Device device = new Device { - Devices = new List(), - ActionDict = new Dictionary(), - Operations = new List(), + Name = deviceElement.Element("Name")?.Value, + Icon = deviceElement.Element("Icon")?.Value, + HighColor = deviceElement.Element("HighLight")?.Attribute("color")?.Value, + Path = deviceElement.Element("Path")?.Value, + Tip = deviceElement.Element("Tip")?.Value, + MeshCollider = deviceElement.Element("MeshCollider") != null, + BoxColliderCenter = deviceElement.Element("BoxCollider")?.Attribute("center")?.Value, + BoxColliderSize = deviceElement.Element("BoxCollider")?.Attribute("size")?.Value, + }; - appData.Modules.Add(module); - // ģ - module.type = moduleElement.Element("Type")?.Value; - module.ModuleName = moduleElement.Element("Name")?.Value; - module.Scene = moduleElement.Element("Scene")?.Value; - - // 豸 - foreach (XElement deviceElement in moduleElement.Elements("Device")) - { - Device device = new Device - { - Name = deviceElement.Element("Name")?.Value, - Icon = deviceElement.Element("Icon")?.Value, - HighColor = deviceElement.Element("HighLight")?.Attribute("color")?.Value, - Path = deviceElement.Element("Path")?.Value, - Tip = deviceElement.Element("Tip")?.Value, - MeshCollider = deviceElement.Element("MeshCollider") != null, - BoxColliderCenter = deviceElement.Element("BoxCollider")?.Attribute("center")?.Value, - BoxColliderSize = deviceElement.Element("BoxCollider")?.Attribute("size")?.Value, - - }; - module.Devices.Add(device); - } + module.Devices.Add(device); + } + // + foreach (XElement actionElement in moduleElement.Elements("Action")) + { + var action = ParseAction(actionElement); // - foreach (XElement actionElement in moduleElement.Elements("Action")) + module.ActionDict.Add(action.Name, action); + } + // ״̬ + foreach (XElement fsmElement in moduleElement.Elements("FSM")) + { + FSM fsm = new FSM() { - var action = ParseAction(actionElement); - // - module.ActionDict.Add(action.Name, action); - } - // ״̬ - foreach (XElement fsmElement in moduleElement.Elements("FSM")) - { - FSM fsm = new FSM() - { - Name = fsmElement.Attribute("name")?.Value, - StateDict = new Dictionary(), - Transisions = new List(), + Name = fsmElement.Attribute("name")?.Value, + StateDict = new Dictionary(), + Transisions = new List(), + }; + + // ״̬ + foreach (var stateNode in fsmElement.Elements("State")) + { + State state = new State() + { + Name = stateNode.Attribute("name")?.Value, }; + fsm.StateDict.Add(state.Name, state); - // ״̬ - foreach (var stateNode in fsmElement.Elements("State")) + XElement enterElement = stateNode.Element("Enter"); + XElement exitElement = stateNode.Element("Exit"); + if (enterElement != null) { - State state = new State() - { - Name = stateNode.Attribute("name")?.Value, - }; - fsm.StateDict.Add(state.Name, state); - - XElement enterElement = stateNode.Element("Enter"); - XElement exitElement = stateNode.Element("Exit"); - if (enterElement != null) - { - state.Enter = new StatePart(); - state.Enter.Action = ParseAction(enterElement.Element("Action")); - } - if (exitElement != null) - { - state.Exit = new StatePart(); - state.Exit.Action = ParseAction(exitElement.Element("Action")); - } - + state.Enter = new StatePart(); + state.Enter.Action = ParseAction(enterElement.Element("Action")); } - // ״̬ת - foreach (var transNode in fsmElement.Elements("Transision")) + if (exitElement != null) { - Transision trans = new Transision() - { - Name = transNode.Attribute("name")?.Value, - From = transNode.Attribute("from")?.Value, - To = transNode.Attribute("to")?.Value, - }; - trans.Action = ParseCondition(transNode.Element("Condition")); - fsm.Transisions.Add(trans); + state.Exit = new StatePart(); + state.Exit.Action = ParseAction(exitElement.Element("Action")); } - module.FSM.Add(fsm.Name, fsm); + } - - foreach (var operationNode in moduleElement.Elements("Operation")) + // ״̬ת + foreach (var transNode in fsmElement.Elements("Transision")) { - //module.Operations - // - - var op = new Operation() + Transision trans = new Transision() { - Steps = new List(), + Name = transNode.Attribute("name")?.Value, + From = transNode.Attribute("from")?.Value, + To = transNode.Attribute("to")?.Value, }; - op.moduleType = operationNode.Attribute("moduleType")?.Value; - foreach (XElement stepNode in operationNode.Elements("Step")) - { - op.Steps.Add(ParserStep(stepNode, null)); - } - module.Operations.Add(op); + trans.Action = ParseCondition(transNode.Element("Condition")); + fsm.Transisions.Add(trans); } + module.FSM.Add(fsm.Name, fsm); + } + foreach (var operationNode in moduleElement.Elements("Operation")) + { + //module.Operations + // - XElement scoreNode = moduleElement.Element("Score"); - if (scoreNode != null) + var op = new Operation() { - module.score = new Score() - { - scores = new List() - }; - foreach (var item in scoreNode.Elements("Item")) - { - module.score.scores.Add( - new ScoreStep() - { - step = item.Attribute("step")?.Value, - name = item.Attribute("name")?.Value, - sum = item.Attribute("sum")?.Value, - bind = item.Attribute("bind")?.Value, - }); - } + Steps = new List(), + }; + op.moduleType = operationNode.Attribute("moduleType")?.Value; + foreach (XElement stepNode in operationNode.Elements("Step")) + { + op.Steps.Add(ParserStep(stepNode, null)); + } + module.Operations.Add(op); + } + + + XElement scoreNode = moduleElement.Element("Score"); + if (scoreNode != null) + { + module.score = new Score() + { + scores = new List() + }; + foreach (var item in scoreNode.Elements("Item")) + { + module.score.scores.Add( + new ScoreStep() + { + step = item.Attribute("step")?.Value, + name = item.Attribute("name")?.Value, + sum = item.Attribute("sum")?.Value, + bind = item.Attribute("bind")?.Value, + }); } } } - return appData; } public static Step ParserStep(XElement stepNode, Step parent) @@ -658,6 +691,21 @@ namespace XMLTool newAction = act; } break; + case "LoadRes": + { + var act = new StringListAction(); + XAttribute resType = action.Attribute("resType"); + if (resType != null) + { + act.args.Add(resType.Value); + } + else + { + act.args.Add(""); + } + newAction = act; + } + break; default: newAction = new Action(); break; diff --git a/Data/App.xml b/Data/App.xml index bc2ca7ab..42dca9d6 100644 --- a/Data/App.xml +++ b/Data/App.xml @@ -1,6 +1,13 @@ + + + + + + + Scene All @@ -631,16 +638,22 @@ - + - - + + + + + + + + - + @@ -923,4 +936,5 @@ + \ No newline at end of file diff --git a/Data/Xml/Pig.xml b/Data/Xml/Pig.xml new file mode 100644 index 00000000..5e7e5f6a --- /dev/null +++ b/Data/Xml/Pig.xml @@ -0,0 +1,929 @@ + + + + Scene + All + 模块2 + + + 骨刀 + 工具/骨刀.png + + + 撬骨板 + 工具/撬骨板.png + + + 手术刀柄4号 + 工具/手术刀柄4号.png + + + 手术刀片16号 + 工具/手术刀片16号.png + + + 铁锤 + 工具/铁锤.png + + + 咬骨钳 + 工具/咬骨钳.png + + + + T管 + 耗材/T管.png + + + + 冲洗管 + 耗材/冲洗管.png + + + + 钢丝 + 耗材/钢丝.png + + + + 骨钉 + 耗材/骨钉.png + + + + 骨蜡 + 耗材/骨蜡.png + + + + + Vetwish软骨素 + 药品/Vetwish软骨素.png + + + + 美洛昔康 + 药品/美洛昔康.png + + + + + + 组织钳 + + SM_QvanChangJing/SM_JianZiLei/zuzhiqian + 组织钳 + + 工具/骨刀.png + + + + 肠钳 + + SM_QvanChangJing/SM_JianZiLei/changqian + 肠钳 + + 工具/骨刀.png + + + 无齿海绵钳 + + SM_QvanChangJing/SM_JianZiLei/wuchihaimianqian + 无齿海绵钳 + + 工具/骨刀.png + + + + + S拉钩 + + SM_QvanChangJing/SM_JianZiLei/pasted__SM_LaGou + S拉钩 + + 工具/骨刀.png + + + + + 肾形盘 + + SM_QvanChangJing/SM_JianZiLei/pasted__SM_ShenXingPan + 肾形盘 + + 工具/骨刀.png + + + + + 器械盒 + + SM_QvanChangJing/SM_JianZiLei/pasted__polySurface114 + 器械盒 + + 工具/骨刀.png + + + + + 创巾钳 + + SM_QvanChangJing/SM_JianZiLei/chuangjinqian + 创巾钳 + + 工具/骨刀.png + + + + 直止血钳 + + SM_QvanChangJing/SM_JianZiLei/zhizhixueqian + 直止血钳 + + 工具/骨刀.png + + + 弯止血钳 + + SM_QvanChangJing/SM_JianZiLei/wanzhixueqian + 弯止血钳 + + 工具/骨刀.png + + + + + 持针钳 + + SM_QvanChangJing/SM_JianZiLei/chizhenqian + 持针钳 + + 工具/骨刀.png + + + + 钝剪 + + SM_QvanChangJing/SM_JianZiLei/dunjian + 钝剪 + + 工具/骨刀.png + + + + 尖剪 + + SM_QvanChangJing/SM_JianZiLei/jianjian + 尖剪 + + 工具/骨刀.png + + + + + + 无齿镊 + + SM_QvanChangJing/SM_JianZiLei/pasted__pPlane4 + 无齿镊 + + 工具/骨刀.png + + + + 手术刀柄3号 + + SM_QvanChangJing/SM_JianZiLei/pasted__SM_ShouShuDaoBing + 手术刀柄3号 + + 工具/骨刀.png + + + + 刀片23号 + + SM_QvanChangJing/SM_JianZiLei/pasted__SM_DaoPian23 + 刀片23号 + + 工具/骨刀.png + + + + 速眠新 + + SM_QvanChangJing/SM_YaoPinLei/SM_sumianxin + 速眠新 + + 药品/美洛昔康.png + + + + + 头孢噻呋 + + SM_QvanChangJing/SM_YaoPinLei/pasted__SM_TouBao + 头孢噻呋 + + 药品/美洛昔康.png + + + + + VC + + SM_QvanChangJing/SM_YaoPinLei/pasted__SM_VC + VC + + 药品/美洛昔康.png + + + + 硫酸阿托品 + + SM_QvanChangJing/SM_YaoPinLei/pasted__SM_ATuoPin + 硫酸阿托品 + + 药品/美洛昔康.png + + + ATP + + SM_QvanChangJing/SM_YaoPinLei/pasted__SM_SanLinsuanxiangan + ATP + + 药品/美洛昔康.png + + + + 肾上腺素 + + SM_QvanChangJing/SM_YaoPinLei/pasted__SM_ShenShangXian + 肾上腺素 + + 药品/美洛昔康.png + + + 红霉素眼膏 + + SM_QvanChangJing/SM_YaoPinLei/SM_hongmeisuyangao + 红霉素眼膏 + + 药品/美洛昔康.png + + + 碘伏喷壶 + + SM_QvanChangJing/SM_YaoPinLei/pasted__polySurface119 + 碘伏喷壶 + + 药品/美洛昔康.png + + + + 75%酒精 + + SM_QvanChangJing/SM_YaoPinLei/pasted__polySurface117 + 75%酒精 + + 药品/美洛昔康.png + + + + 5%葡萄糖注射液50ml + + SM_QvanChangJing/SM_YaoPinLei/pasted__pCylinder3 + 5%葡萄糖注射液50ml + + 药品/美洛昔康.png + + + + 0.9%氯化钠注射液100ml + + SM_QvanChangJing/SM_YaoPinLei/pasted__lhn1 + 0.9%氯化钠注射液100ml + + 药品/美洛昔康.png + + + + + + 电动剃毛刀 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__dtz1 + 电动剃毛刀 + + 耗材/骨蜡.png + + + + + 医用外科罩 + + SM_QvanChangJing/SM_BuLiaoLei/yiyongkouzhao + 医用外科罩 + + 耗材/骨蜡.png + + + + 无菌敷料 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_WuJingFuLiao + 无菌敷料 + + 耗材/骨蜡.png + + + + 纱布绷带 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_BengDai_pPlane6 + 纱布绷带 + + 耗材/骨蜡.png + + + + 24G静脉留置针 + + SM_QvanChangJing/SM_BuLiaoLei/liuzhizhen/pasted__pasted__polySurface560 + 24G静脉留置针 + + 耗材/骨蜡.png + + + 一次性注射器 + + SM_QvanChangJing/SM_BuLiaoLei/SM_ShuYeQi + 一次性注射器 + + 耗材/骨蜡.png + + + 纸胶带 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_ZhiJiaoDai_polySurface125 + 纸胶带 + + 耗材/骨蜡.png + + + 弹性粘性绷带 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__pPlane6 + 弹性粘性绷带 + + 耗材/骨蜡.png + + + + 大胶带 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__polySurface125 + 大胶带 + + 耗材/骨蜡.png + + + 刷手毛刷 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__pCube35 + 刷手毛刷 + + 耗材/骨蜡.png + + + + 宠物电子体温计 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_DianZiTiWenJiShape + 宠物电子体温计 + + 耗材/骨蜡.png + + + 一次性注射器1 + + SM_QvanChangJing/SM_BuLiaoLei/zhusheqi + 一次性注射器 + + 耗材/骨蜡.png + + + 肝素帽 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__pCylinder7 + 肝素帽 + + 耗材/骨蜡.png + + + 创巾 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_ChuangJin + 创巾 + + 耗材/骨蜡.png + + + 保定保温毛巾 + + SM_QvanChangJing/SM_BuLiaoLei/Object003__0 + 保定保温毛巾 + + 耗材/骨蜡.png + + + 带针PGA缝线 + + SM_QvanChangJing/SM_BuLiaoLei/zhenxian/平面 + 带针PGA缝线 + + 耗材/骨蜡.png + + + 听诊器 + + SM_QvanChangJing/SM_BuLiaoLei/SM_TingZhenQi/Archmodels70_054_01 + 听诊器 + + 耗材/骨蜡.png + + + 一次性手术帽 + + SM_QvanChangJing/SM_BuLiaoLei/SM_YiYongMao + 一次性手术帽 + + 耗材/骨蜡.png + + + 一次性手术衣 + + SM_QvanChangJing/SM_BuLiaoLei/shoufuyi + 一次性手术衣 + + 耗材/骨蜡.png + + + 一次性外科灭菌手套 + + SM_QvanChangJing/SM_BuLiaoLei/SM_YiYongMao.001 + 一次性外科灭菌手套 + + 耗材/骨蜡.png + + + 无菌擦手纸 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_YiYongCaShouZhi + 无菌擦手纸 + + 耗材/骨蜡.png + + + 无菌纱布 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_ShouShuGongJu_SM_WuJunShaBu_SM_WuJunShaBu + 无菌纱布 + + 耗材/骨蜡.png + + + 酒精棉球 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_JiuJingMianQiu_polySurface123 + 酒精棉球 + + 耗材/骨蜡.png + + + 碘伏棉球 + + SM_QvanChangJing/SM_BuLiaoLei/pasted__SM_DianFuMianQiu_polySurface123 + 碘伏棉球 + + 耗材/骨蜡.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Xml配置文档.xml b/Doc/Xml配置文档.xml index 0e9e783d..897e0bb0 100644 --- a/Doc/Xml配置文档.xml +++ b/Doc/Xml配置文档.xml @@ -32,7 +32,7 @@ - +