IssueFix.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using UnityEditor;
  4. using UnityEditor.Callbacks;
  5. using UnityEngine;
  6. using UnityEngine.Rendering;
  7. using Wheels.Unity;
  8. [InitializeOnLoad]
  9. public partial class IssueFix : EditorWindow
  10. {
  11. static ARSDKConfig sdkConfig;
  12. static Texture2D logo;
  13. static bool allFixed = true;
  14. /// <summary>
  15. /// 目标系统平台,必须是Android
  16. /// </summary>
  17. static bool targetPlatform;
  18. /// <summary>
  19. /// SDK是否为C/S架构,如果是的话需要向ScriptingDefineSymbols添加CS符号,否则移除
  20. /// </summary>
  21. static bool clientServerMode;
  22. /// <summary>
  23. /// GraphicsAPI必须是OpenGLES3或OpenGLES2,否则为false
  24. /// </summary>
  25. static bool graphicsAPIOK;
  26. /// <summary>
  27. /// Android最小支持sdk版本,大于等于27为true
  28. /// </summary>
  29. static bool minimum_API_Level;
  30. /// <summary>
  31. /// 编译此项目用到的sdk版本
  32. /// </summary>
  33. static bool target_API_Level;
  34. /// <summary>
  35. /// 是Mono还是IL2CPP,IL2CPP为true
  36. /// </summary>
  37. static bool scripting_Backend;
  38. /// <summary>
  39. /// 目标平台为ARM64为true
  40. /// </summary>
  41. static bool target_Architectures;
  42. /// <summary>
  43. /// 允许unsafe为true
  44. /// </summary>
  45. static bool allow_Unsafe_Code;
  46. /// <summary>
  47. /// 禁用MultiThreadedRendering为true
  48. /// </summary>
  49. static bool disableMultiThreadedRendering;
  50. static IssueFix()
  51. {
  52. AssetDatabase.importPackageCompleted -= AssetDatabase_importPackageCompleted;
  53. AssetDatabase.importPackageCompleted += AssetDatabase_importPackageCompleted;
  54. }
  55. private void OnEnable()
  56. {
  57. Init();
  58. FixTags();
  59. }
  60. private static void AssetDatabase_importPackageCompleted(string packageName)
  61. {
  62. if (packageName.Contains("EZXR_ARGlass_SDK"))
  63. {
  64. string filePath = "EZXR_CICD.cfg";
  65. if (File.Exists(filePath))
  66. {
  67. FixAllIssues();
  68. File.WriteAllText(filePath, "AllFixed");
  69. }
  70. else
  71. {
  72. ShowWindow();
  73. }
  74. }
  75. }
  76. [MenuItem("ARSDK/Project Settings", false, 50)]
  77. public static void ShowWindow()
  78. {
  79. EditorWindow window = EditorWindow.GetWindow(typeof(IssueFix), false, "Project Settings");
  80. window.minSize = new Vector2(300, 300);
  81. }
  82. [DidReloadScripts]
  83. /// <summary>
  84. /// 进行所有代码之前必须先执行的初始化操作,取到ARSDK的配置文件
  85. /// </summary>
  86. static void Init()
  87. {
  88. string filePath = "Assets/EZXRGlassSDK/Editor/ARSDKConfig.asset";
  89. if ((AssetDatabase.LoadAssetAtPath(filePath, typeof(ARSDKConfig)) as ARSDKConfig) == null)
  90. {
  91. filePath = AssetDatabase.GUIDToAssetPath("2c84fdf00cdace44ba329395d9e29d08");
  92. }
  93. sdkConfig = AssetDatabase.LoadAssetAtPath(filePath, typeof(ARSDKConfig)) as ARSDKConfig;
  94. if (sdkConfig != null)
  95. {
  96. SetAbilitiesSymbols();
  97. CheckAllIssues();
  98. if (!allFixed)
  99. {
  100. ShowWindow();
  101. }
  102. }
  103. }
  104. partial void OnGUI_X1();
  105. static bool foldout_IssueFix = true;
  106. GUIStyle label_Red;
  107. //static bool foldout_Settings = true;
  108. void OnGUI()
  109. {
  110. if (logo == null)
  111. {
  112. logo = Resources.Load<Texture2D>("ezxr_logo");
  113. }
  114. GUILayout.Button(logo, GUILayout.Height(200));
  115. EditorGUILayout.Separator();
  116. CheckAllIssues();
  117. UnityEditorGUI.DrawLine();
  118. foldout_IssueFix = EditorGUILayout.Foldout(foldout_IssueFix, "Project IssueFix");
  119. if (foldout_IssueFix)
  120. {
  121. label_Red = new GUIStyle(EditorStyles.label);
  122. label_Red.normal.textColor = Color.red;
  123. if (allFixed)
  124. {
  125. EditorGUILayout.HelpBox("Everything is OK!", MessageType.Info);
  126. }
  127. else
  128. {
  129. EditorGUILayout.HelpBox("For AR Glass Project, all issues below must be fixed, or your project cannot run on AR Glass devices!", MessageType.Warning);
  130. }
  131. EditorGUILayout.Separator();
  132. #region 通用修复项
  133. if (!targetPlatform)
  134. {
  135. GUILayout.BeginHorizontal();
  136. GUILayout.Label("Platform:");
  137. GUILayout.FlexibleSpace();
  138. GUILayout.Label("Should be 'Android'", label_Red);
  139. if (GUILayout.Button("Fix"))
  140. {
  141. FixTargetPlatform();
  142. }
  143. GUILayout.EndHorizontal();
  144. EditorGUILayout.Separator();
  145. }
  146. if (!clientServerMode)
  147. {
  148. GUILayout.BeginHorizontal();
  149. GUILayout.Label("C/S:");
  150. GUILayout.FlexibleSpace();
  151. GUILayout.Label("Should be Fixed", label_Red);
  152. if (GUILayout.Button("Fix"))
  153. {
  154. FixClientServerMode();
  155. }
  156. GUILayout.EndHorizontal();
  157. EditorGUILayout.Separator();
  158. }
  159. if (!graphicsAPIOK)
  160. {
  161. GUILayout.BeginHorizontal();
  162. GUILayout.Label("GraphicsAPI Status:");
  163. GUILayout.FlexibleSpace();
  164. GUILayout.Label("Should be 'OpenGLES3 or OpenGLES2'", label_Red);
  165. if (GUILayout.Button("Fix"))
  166. {
  167. FixGraphicsAPI();
  168. }
  169. GUILayout.EndHorizontal();
  170. EditorGUILayout.Separator();
  171. }
  172. if (!minimum_API_Level)
  173. {
  174. GUILayout.BeginHorizontal();
  175. GUILayout.Label("Minimum API Level:");
  176. GUILayout.FlexibleSpace();
  177. GUILayout.Label("Recommend be '" + (AndroidSdkVersions)sdkConfig.recommendedAPILevel + "'", label_Red);
  178. if (GUILayout.Button("Fix"))
  179. {
  180. FixMinimumAPILevel();
  181. }
  182. GUILayout.EndHorizontal();
  183. EditorGUILayout.Separator();
  184. }
  185. if (!target_API_Level)
  186. {
  187. GUILayout.BeginHorizontal();
  188. GUILayout.Label("Target API Level: ");
  189. GUILayout.FlexibleSpace();
  190. GUILayout.Label("Recommend be '" + sdkConfig.recommendedAPILevel + "'", label_Red);
  191. if (GUILayout.Button("Fix"))
  192. {
  193. FixTargetAPILevel();
  194. }
  195. GUILayout.EndHorizontal();
  196. EditorGUILayout.Separator();
  197. }
  198. if (!scripting_Backend)
  199. {
  200. GUILayout.BeginHorizontal();
  201. GUILayout.Label("Scripting Backend: ");
  202. GUILayout.FlexibleSpace();
  203. GUILayout.Label("Should be 'IL2CPP'", label_Red);
  204. if (GUILayout.Button("Fix"))
  205. {
  206. FixScriptingBackend();
  207. }
  208. GUILayout.EndHorizontal();
  209. EditorGUILayout.Separator();
  210. }
  211. if (!target_Architectures)
  212. {
  213. GUILayout.BeginHorizontal();
  214. GUILayout.Label("Target Architectures: ");
  215. GUILayout.FlexibleSpace();
  216. GUILayout.Label("Should be 'ARM64'", label_Red);
  217. if (GUILayout.Button("Fix"))
  218. {
  219. FixTargetArchitectures();
  220. }
  221. GUILayout.EndHorizontal();
  222. EditorGUILayout.Separator();
  223. }
  224. if (!allow_Unsafe_Code)
  225. {
  226. GUILayout.BeginHorizontal();
  227. GUILayout.Label("Allow Unsafe Code: ");
  228. GUILayout.FlexibleSpace();
  229. GUILayout.Label("Should be 'Checked'", label_Red);
  230. if (GUILayout.Button("Fix"))
  231. {
  232. FixAllowUnsafeCode();
  233. }
  234. GUILayout.EndHorizontal();
  235. EditorGUILayout.Separator();
  236. }
  237. if (!disableMultiThreadedRendering)
  238. {
  239. GUILayout.BeginHorizontal();
  240. GUILayout.Label("MultiThreadedRendering: ");
  241. GUILayout.FlexibleSpace();
  242. GUILayout.Label("MultiThreadedRendering must be 'Disabled'", label_Red);
  243. if (GUILayout.Button("Fix"))
  244. {
  245. FixMultiThreadedRendering();
  246. }
  247. GUILayout.EndHorizontal();
  248. }
  249. #endregion
  250. OnGUI_X1();
  251. }
  252. UnityEditorGUI.DrawLine();
  253. //foldout_Settings = EditorGUILayout.Foldout(foldout_Settings, "Project XR Abilities");
  254. //if (foldout_Settings)
  255. //{
  256. // EditorGUILayout.BeginVertical(EditorStyles.helpBox);
  257. // EditorGUILayout.BeginHorizontal();
  258. // projectConfig.spatialTracking = EditorGUILayout.ToggleLeft("spatialTracking", projectConfig.spatialTracking, GUILayout.Width(150));
  259. // projectConfig.planeDetection = EditorGUILayout.ToggleLeft("planeDetection", projectConfig.planeDetection, GUILayout.Width(150));
  260. // projectConfig.imageDetection = EditorGUILayout.ToggleLeft("imageDetection", projectConfig.imageDetection, GUILayout.Width(150));
  261. // EditorGUILayout.EndHorizontal();
  262. // EditorGUILayout.BeginHorizontal();
  263. // projectConfig.spatialMesh = EditorGUILayout.ToggleLeft("spatialMesh", projectConfig.spatialMesh, GUILayout.Width(150));
  264. // projectConfig.handTracking = EditorGUILayout.ToggleLeft("handTracking", projectConfig.handTracking, GUILayout.Width(150));
  265. // projectConfig.spatialPositioning = EditorGUILayout.ToggleLeft("spatialPositioning", projectConfig.spatialPositioning, GUILayout.Width(150));
  266. // EditorGUILayout.EndHorizontal();
  267. // projectConfig.miraCast = EditorGUILayout.ToggleLeft("MiraCast", projectConfig.miraCast, GUILayout.Width(150));
  268. // EditorGUILayout.BeginHorizontal();
  269. // EditorGUILayout.EndHorizontal();
  270. // EditorGUILayout.EndVertical();
  271. //}
  272. }
  273. static partial void CheckAllIssues_X1();
  274. static void CheckAllIssues()
  275. {
  276. #region 通用修复项
  277. //目标系统平台必须是Android
  278. BuildTarget buildTarget = EditorUserBuildSettings.activeBuildTarget;
  279. if (buildTarget == BuildTarget.Android)
  280. {
  281. targetPlatform = true;
  282. allFixed &= targetPlatform;
  283. }
  284. else
  285. {
  286. targetPlatform = false;
  287. allFixed &= targetPlatform;
  288. }
  289. string symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
  290. if (sdkConfig.clientServerMode)
  291. {
  292. if (string.IsNullOrEmpty(symbols))
  293. {
  294. clientServerMode = false;
  295. }
  296. else if (symbols.Contains("EZXRCS"))
  297. {
  298. clientServerMode = true;
  299. }
  300. else
  301. {
  302. clientServerMode = false;
  303. }
  304. }
  305. else
  306. {
  307. if (string.IsNullOrEmpty(symbols))
  308. {
  309. clientServerMode = true;
  310. }
  311. else if (symbols.Contains("EZXRCS"))
  312. {
  313. clientServerMode = false;
  314. }
  315. else
  316. {
  317. clientServerMode = true;
  318. }
  319. }
  320. //GraphicsAPI必须是OpenGLES3或OpenGLES2,否则为false
  321. GraphicsDeviceType[] graphicsAPIs = PlayerSettings.GetGraphicsAPIs(BuildTarget.Android);
  322. foreach (GraphicsDeviceType item in graphicsAPIs)
  323. {
  324. if (item != GraphicsDeviceType.OpenGLES3 && item != GraphicsDeviceType.OpenGLES2)
  325. {
  326. graphicsAPIOK = false;
  327. allFixed &= graphicsAPIOK;
  328. break;
  329. }
  330. else
  331. {
  332. graphicsAPIOK = true;
  333. allFixed &= graphicsAPIOK;
  334. }
  335. }
  336. //Android最小支持sdk版本
  337. AndroidSdkVersions androidSdkVersions = PlayerSettings.Android.minSdkVersion;
  338. if ((int)androidSdkVersions >= sdkConfig.recommendedAPILevel)
  339. {
  340. minimum_API_Level = true;
  341. allFixed &= minimum_API_Level;
  342. }
  343. else
  344. {
  345. minimum_API_Level = false;
  346. allFixed &= minimum_API_Level;
  347. }
  348. //用于编译项目的sdk版本
  349. AndroidSdkVersions targetAndroidSdkVersions = PlayerSettings.Android.targetSdkVersion;
  350. if ((int)targetAndroidSdkVersions >= sdkConfig.recommendedAPILevel)
  351. {
  352. target_API_Level = true;
  353. allFixed &= target_API_Level;
  354. }
  355. else
  356. {
  357. target_API_Level = false;
  358. allFixed &= target_API_Level;
  359. }
  360. //脚本backend
  361. if (PlayerSettings.GetScriptingBackend(BuildTargetGroup.Android) == ScriptingImplementation.IL2CPP)
  362. {
  363. scripting_Backend = true;
  364. allFixed &= scripting_Backend;
  365. }
  366. else
  367. {
  368. scripting_Backend = false;
  369. allFixed &= scripting_Backend;
  370. }
  371. //cpu架构
  372. if (PlayerSettings.Android.targetArchitectures == AndroidArchitecture.ARM64)
  373. {
  374. target_Architectures = true;
  375. allFixed &= target_Architectures;
  376. }
  377. else
  378. {
  379. target_Architectures = false;
  380. allFixed &= target_Architectures;
  381. }
  382. //是否允许unsafe代码
  383. if (PlayerSettings.allowUnsafeCode)
  384. {
  385. allow_Unsafe_Code = true;
  386. allFixed &= allow_Unsafe_Code;
  387. }
  388. else
  389. {
  390. allow_Unsafe_Code = false;
  391. allFixed &= allow_Unsafe_Code;
  392. }
  393. //是否禁用MultiThreadedRendering
  394. if (PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android))
  395. {
  396. disableMultiThreadedRendering = false;
  397. allFixed &= disableMultiThreadedRendering;
  398. }
  399. else
  400. {
  401. disableMultiThreadedRendering = true;
  402. allFixed &= disableMultiThreadedRendering;
  403. }
  404. #endregion
  405. CheckAllIssues_X1();
  406. }
  407. #region 通用修复项
  408. static void FixTags()
  409. {
  410. string[] tags = new string[] { "SpatialObject", "SpatialUI", "SpatialUI(NoInteractable)", "SpatialHandler" };
  411. Object tagManagerObject = AssetDatabase.LoadAssetAtPath("ProjectSettings/TagManager.asset", typeof(Object));
  412. if (tagManagerObject == null)
  413. {
  414. return;
  415. }
  416. SerializedObject tagManager = new SerializedObject(tagManagerObject);
  417. SerializedProperty tagsProp = tagManager.FindProperty("tags");
  418. //Debug.Log("TagsPorp Size:" + tagsProp.arraySize);
  419. List<string> tagsExists = new List<string>();
  420. for (int i = 0; i < tagsProp.arraySize; i++)
  421. {
  422. tagsExists.Add(tagsProp.GetArrayElementAtIndex(i).stringValue);
  423. }
  424. foreach (string tag in tags)
  425. {
  426. if (!tagsExists.Contains(tag))
  427. {
  428. tagsExists.Add(tag);
  429. }
  430. }
  431. tagsProp.ClearArray();
  432. foreach (string tag in tagsExists)
  433. {
  434. tagsProp.InsertArrayElementAtIndex(Mathf.Clamp(0, tagsProp.arraySize - 1, 128));
  435. tagsProp.GetArrayElementAtIndex(tagsProp.arraySize - 1).stringValue = tag;
  436. }
  437. tagManager.ApplyModifiedProperties();
  438. }
  439. static void FixTargetPlatform()
  440. {
  441. EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android);
  442. }
  443. static void FixClientServerMode()
  444. {
  445. if (sdkConfig.clientServerMode)
  446. {
  447. //向ScriptingDefineSymbols添加EZXRCS
  448. var symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
  449. if (!symbols.Contains("EZXRCS"))
  450. {
  451. symbols += ";EZXRCS";
  452. PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, symbols);
  453. }
  454. }
  455. else
  456. {
  457. //去掉ScriptingDefineSymbols中的EZXRCS,避免移除package的时候会因为引用丢失而报错
  458. string symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
  459. if (symbols.Contains("EZXRCS;"))
  460. {
  461. symbols = symbols.Replace("EZXRCS;", "");
  462. PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, symbols);
  463. }
  464. else if (symbols.Contains("EZXRCS"))
  465. {
  466. symbols = symbols.Replace("EZXRCS", "");
  467. PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, symbols);
  468. }
  469. }
  470. AssetDatabase.SaveAssets();
  471. AssetDatabase.Refresh();
  472. }
  473. static void FixGraphicsAPI()
  474. {
  475. PlayerSettings.SetUseDefaultGraphicsAPIs(BuildTarget.Android, false);
  476. PlayerSettings.SetGraphicsAPIs(BuildTarget.Android, new GraphicsDeviceType[] { GraphicsDeviceType.OpenGLES3 });
  477. }
  478. static void FixMinimumAPILevel()
  479. {
  480. PlayerSettings.Android.minSdkVersion = (AndroidSdkVersions)sdkConfig.recommendedAPILevel;
  481. }
  482. static void FixTargetAPILevel()
  483. {
  484. PlayerSettings.Android.targetSdkVersion = (AndroidSdkVersions)sdkConfig.recommendedAPILevel;
  485. }
  486. static void FixScriptingBackend()
  487. {
  488. PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP);
  489. }
  490. static void FixTargetArchitectures()
  491. {
  492. PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64;
  493. }
  494. static void FixAllowUnsafeCode()
  495. {
  496. PlayerSettings.allowUnsafeCode = true;
  497. }
  498. static void FixMultiThreadedRendering()
  499. {
  500. PlayerSettings.SetMobileMTRendering(BuildTargetGroup.Android, false);
  501. }
  502. /// <summary>
  503. /// 将sdk所带的功能名配置到全局符号定义,主要用于类似XRMan这种会涉及到多模块的脚本做#if用
  504. /// </summary>
  505. static void SetAbilitiesSymbols()
  506. {
  507. if (sdkConfig.spatialMesh)
  508. {
  509. AddSymbol("SpatialMesh");
  510. }
  511. else
  512. {
  513. RemoveSymbol("SpatialMesh");
  514. }
  515. if (sdkConfig.spatialComputing)
  516. {
  517. AddSymbol("SpatialComputing");
  518. }
  519. else
  520. {
  521. RemoveSymbol("SpatialComputing");
  522. }
  523. if (sdkConfig.imageTracking)
  524. {
  525. AddSymbol("Tracking2D");
  526. }
  527. else
  528. {
  529. RemoveSymbol("Tracking2D");
  530. }
  531. if (sdkConfig.objectDetection)
  532. {
  533. AddSymbol("Tracking3D");
  534. }
  535. else
  536. {
  537. RemoveSymbol("Tracking3D");
  538. }
  539. AssetDatabase.SaveAssets();
  540. AssetDatabase.Refresh();
  541. }
  542. /// <summary>
  543. /// 向ScriptingDefineSymbols添加symbol
  544. /// </summary>
  545. /// <param name="symbol"></param>
  546. static void AddSymbol(string symbol)
  547. {
  548. var symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
  549. if (!symbols.Contains(symbol))
  550. {
  551. symbols += ";" + symbol;
  552. PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, symbols);
  553. }
  554. }
  555. /// <summary>
  556. /// 从ScriptingDefineSymbols中去掉symbol
  557. /// </summary>
  558. /// <param name="symbol"></param>
  559. static void RemoveSymbol(string symbol)
  560. {
  561. string symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
  562. if (symbols.Contains(symbol + ";"))
  563. {
  564. symbols = symbols.Replace(symbol + ";", "");
  565. PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, symbols);
  566. }
  567. else if (symbols.Contains(symbol))
  568. {
  569. symbols = symbols.Replace(symbol, "");
  570. PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, symbols);
  571. }
  572. }
  573. //Note: 这里每添加一条,都应该在下方的FixAllIssues中添加一行执行代码
  574. #endregion
  575. static partial void Fix_X1();
  576. public static void FixAllIssues()
  577. {
  578. Init();
  579. #region 通用修复项
  580. FixTags();
  581. FixTargetPlatform();
  582. FixClientServerMode();
  583. FixGraphicsAPI();
  584. FixMinimumAPILevel();
  585. FixTargetAPILevel();
  586. FixScriptingBackend();
  587. FixTargetArchitectures();
  588. FixAllowUnsafeCode();
  589. FixMultiThreadedRendering();
  590. SetAbilitiesSymbols();
  591. #endregion
  592. Fix_X1();
  593. }
  594. }