Skip to content

متغيرات النظام ​

تشرح هذه الصفحة كيفية عمل متغيرات النظام في MLightCAD، وكيف يمكن للمستخدمين تغييرها من سطر الأوامر، وكيفية تنفيذها عبر AcDbSystemVariables وAcDbSysVarManager.

ما هو متغير النظام ​

متغير النظام هو إعداد عام يتحكم في سلوك أجزاء من نظام CAD.

تبدأ الأوامر عادةً إجراءً ما، أو تُنشئ هندسة، أو تفتح مربع حوار. أما متغيرات النظام فتفعل شيئًا مختلفًا: فهي تتحكم في سلوك الأوامر، أو القيم الافتراضية، أو حالة الرسم، أو سلوك واجهة المستخدم.

تشمل الأمثلة النموذجية ما يلي:

  • الطبقة التي يجب إنشاء الكيانات الجديدة عليها
  • اللون الافتراضي أو وزن الخط أو مقياس نوع الخط الذي يجب استخدامه
  • ما إذا كان وضع العرض مُفعَّلًا
  • كيف يجب أن يستجيب المحرر أو العارض بصريًا

هذا مشابه عمدًا لـ AutoCAD. في MLightCAD، يمكنك تعيين متغير نظام مباشرةً من سطر الأوامر بإدخال اسم المتغير، ثم إدخال قيمته الجديدة.

على سبيل المثال:

text
Command: PICKBOX
New value for PICKBOX <3>: 5

هذا يعني أن سطر الأوامر يتعامل مع اسم متغير النظام نفسه كأمر يُستخدم لتحديث ذلك الإعداد.

يعتمد MLightCAD هذا النموذج حتى تتمكن إعدادات وقت التشغيل من القراءة والتغيير والمراقبة عبر آلية واحدة متسقة بدلًا من ترميزها داخل منطق الأوامر.

تعيين متغير نظام من سطر الأوامر ​

سير العمل في سطر الأوامر بسيط:

  1. اكتب اسم متغير النظام.
  2. اضغط Enter.
  3. أدخل القيمة الجديدة.
  4. اضغط Enter مرة أخرى لتطبيقها.

هذا هو نمط التفاعل نفسه الذي يعرفه كثير من مستخدمي CAD بالفعل من AutoCAD.

على سبيل المثال، لتغيير الطبقة الحالية:

text
Command: CLAYER
New value for CLAYER <0>: Walls

لتغيير حجم مربع الالتقاط:

text
Command: PICKBOX
New value for PICKBOX <3>: 10

وبعبارة أخرى، لا يتطلب تعيين متغير نظام سير عمل منفصلًا على غرار SETVAR. يمكنك إدخال اسم متغير النظام مباشرةً في سطر الأوامر وتعيين قيمة جديدة له.

كيف تُسجَّل متغيرات النظام كأوامر ​

في MLightCAD، يمكن استخدام متغيرات النظام من سطر الأوامر لأنها تُسجَّل كأوامر عادية أثناء تهيئة التطبيق.

يحدث التسجيل في AcApDocManager. فهو يحمّل جميع واصفات متغيرات النظام من AcDbSysVarManager ويسجّل كل اسم متغير كأمر:

ts
const sysVars = AcDbSysVarManager.instance().getAllDescriptors()
sysVars.forEach(sysVar => {
  register.addCommand(
    AcEdCommandStack.SYSTEMT_COMMAND_GROUP_NAME,
    sysVar.name,
    sysVar.name,
    new AcApSysVarCmd()
  )
})

هذا يعني:

  • يصبح كل متغير نظام مُسجَّل أمرًا تلقائيًا
  • اسم الأمر هو اسم متغير النظام نفسه، مثل CLAYER أو PICKBOX
  • تشترك كل هذه الأوامر في التنفيذ نفسه: AcApSysVarCmd

لا يرمّز AcApSysVarCmd متغيرًا معينًا بشكل ثابت. بل يستخدم عند تشغيله اسم الأمر الحالي (this.globalName) للبحث عن واصف متغير النظام المطابق، ثم يطلب من المستخدم قيمة جديدة، ثم يستدعي setVar(...).

تدفقه الفعلي هو:

إدخال اسم متغير النظام -> AcApSysVarCmd.execute() -> طلب القيمة -> AcDbSysVarManager.setVar(...)

إذن هناك طبقتان معنيّتان:

  • AcDbSysVarManager يقرر أي متغيرات نظام موجودة في وقت التشغيل
  • AcApDocManager يعرض متغيرات وقت التشغيل هذه كأوامر في سطر الأوامر

ولهذا السبب تبدأ إضافة دعم لمتغير نظام جديد عادةً بتسجيل واصفه في AcDbSysVarManager. وبمجرد إدراجه في getAllDescriptors()، يمكن أيضًا تسجيله في مكدس الأوامر واستخدامه مباشرةً من سطر الأوامر.

كيف صُمِّم في MLightCAD ​

يتمحور التنفيذ الحالي حول ملفين:

يخدم كل منهما غرضًا مختلفًا.

1. AcDbSystemVariables ​

AcDbSystemVariables هو القائمة المرجعية لثوابت أسماء متغيرات النظام.

أدواره الرئيسية هي:

  • توفير مصدر واحد موثوق لأسماء المتغيرات
  • تجنّب السلاسل النصية المرمّزة في جميع أنحاء قاعدة الشيفرة
  • منح المستدعين طريقة آمنة من حيث الأنواع للإشارة إلى المتغيرات
  • دعم الأنواع المشتقة مثل AcDbSystemVariableName

من الأفضل فهمه على أنه سجل أسماء متغيرات النظام في MLightCAD.

2. AcDbSysVarManager ​

AcDbSysVarManager هو مدير وقت التشغيل لمتغيرات النظام. وهو مسؤول عن:

  • تسجيل واصفات المتغيرات
  • تخزين البيانات الوصفية للنوع والقيمة الافتراضية
  • إتاحة وصول موحّد عبر getVar وsetVar
  • تخزين المتغيرات غير المرتبطة بقاعدة البيانات مؤقتًا
  • إرسال أحداث التغيير

هو فعليًا السجل وطبقة الوصول ومركز الأحداث لمتغيرات النظام.

نوعان من متغيرات النظام ​

في التصميم الحالي، تنقسم متغيرات النظام إلى فئتين.

المتغيرات المقيمة في قاعدة البيانات ​

تعيش هذه المتغيرات على AcDbDatabase. يقرأها AcDbSysVarManager ويكتبها عبر ربط اسم المتغير بحقل في قاعدة البيانات.

تشمل الأمثلة المسجلة حاليًا:

  • CECOLOR
  • CELTSCALE
  • CELWEIGHT
  • CLAYER
  • LWDISPLAY

وهي أقرب إلى حالة الرسم وخصائص الرسم الافتراضية.

المتغيرات غير المرتبطة بقاعدة البيانات ​

لا تُخزَّن هذه المتغيرات مباشرةً على AcDbDatabase. بل تُخزَّن مؤقتًا داخل AcDbSysVarManager.

تشمل الأمثلة المسجلة حاليًا:

  • COLORTHEME
  • PICKBOX
  • WHITEBKCOLOR

وهي أقرب إلى سلوك المحرر أو حالة واجهة المستخدم.

لماذا يهم هذا الفصل ​

لفصل نوعي المتغيرات فائدتان مباشرتان:

  • يمكن أن تبقى الإعدادات المتعلقة بالرسم مرتبطة بنموذج قاعدة البيانات
  • لا حاجة لإجبار الإعدادات المتعلقة بالتطبيق المضيف أو واجهة المستخدم على الدخول إلى طبقة قاعدة البيانات

وهذا يسمح لمتغيرات النظام بخدمة نموذج البيانات وطبقة المحرر بشكل نظيف.

القدرات الأساسية في التنفيذ الحالي ​

وصول موحّد ​

لا يحتاج المستدعون إلى معرفة ما إذا كان المتغير مخزّنًا في قاعدة البيانات أو في ذاكرة التخزين المؤقت التي يديرها المدير. يمكنهم استخدام واجهة الوصول نفسها في الحالتين:

ts
const sysVarManager = AcDbSysVarManager.instance()

const currentLayer = sysVarManager.getVar('CLAYER', db)
sysVarManager.setVar('CLAYER', 'Walls', db)
sysVarManager.setVar('PICKBOX', 12, db)

تحويل الأنواع ​

يجري setVar تحويلًا أساسيًا بناءً على نوع الواصف المسجّل. يدعم التنفيذ الحالي التحويل لقيم مثل:

  • number
  • boolean
  • color

وهذا مفيد عندما تأتي القيم من إدخال سطر الأوامر أو النماذج أو البرامج النصية وتصل في البداية كسلاسل نصية.

الإشعار بالتغيير ​

يتيح AcDbSysVarManager حدث sysVarChanged حتى تتمكن الوحدات ذات المستوى الأعلى من الاستجابة لتحديثات متغيرات النظام.

ts
AcDbSysVarManager.instance().events.sysVarChanged.addEventListener(args => {
  console.log(args.name, args.oldVal, args.newVal)
})

في التنفيذ الحالي، يُرسَل هذا الحدث أساسًا عند تغيير المتغيرات غير المرتبطة بقاعدة البيانات، مما يجعله مناسبًا بشكل خاص لمزامنة المحرر وواجهة المستخدم.

مثال: PICKBOX ​

يمثل PICKBOX نصف حجم مربع الالتقاط بالبكسلات. وهو متغير غير مرتبط بقاعدة البيانات، لكنه يؤثر مباشرةً في سلوك تفاعل المستخدم.

في cad-viewer، يستمع AcEdCursorManager لتغييرات PICKBOX. وعندما تتغير القيمة، يعيد بناء الجزء المستطيل من مؤشر التقاطع ويعيد تطبيق المؤشر النشط فورًا. وهذا يبيّن أن متغير النظام ليس مجرد بيانات إعداد مخزّنة؛ بل يمكنه أيضًا أن يكون محرّكًا لسلوك واجهة المستخدم الحيّ.

التنفيذ المرجعي:

التدفق هو:

setVar('PICKBOX', ...) -> حدث sysVarChanged -> مدير المؤشر يحدّث مظهر المؤشر

هذا واحد من أوضح الأمثلة على سبب فائدة هذا التجريد.

تفصيل مهم في الشيفرة الحالية ​

يحدد AcDbSystemVariables.ts المجموعة المرجعية لأسماء المتغيرات المعروفة، لكن AcDbSysVarManager يسجّل حاليًا مجموعة فرعية منها فقط في مُنشئه.

وبعبارة أخرى:

  • AcDbSystemVariables هو كتالوج الأسماء
  • AcDbSysVarManager.registry يحدد المتغيرات المدعومة فعليًا في وقت التشغيل

هذا مسار تطوير منطقي: تعريف الأسماء أولًا، ثم إضافة البيانات الوصفية للنوع والقيم الافتراضية واستراتيجية التخزين والسلوك تدريجيًا مع دعم كل متغير.

نمط التوسيع الموصى به ​

عند إضافة المزيد من متغيرات النظام في المستقبل، سير العمل الموصى به هو:

  1. إضافة ثابت اسم المتغير إلى AcDbSystemVariables
  2. تسجيل الواصف في AcDbSysVarManager
  3. تحديد ما إذا كان مقيمًا في قاعدة البيانات أو في وقت التشغيل فقط
  4. تعريف نوعه وقيمته الافتراضية ووصفه
  5. إذا كان يجب أن يؤثر في الأوامر أو واجهة المستخدم، ففضّل التكامل القائم على الأحداث بدلًا من الفحوصات المرمّزة في منطق الأعمال

كيفية إضافة متغير نظام جديد ​

تتضمن إضافة متغير نظام جديد عادةً خمس خطوات.

1. إضافة اسم المتغير إلى AcDbSystemVariables ​

أولًا، أضف ثابت اسم مرجعي جديد في AcDbSystemVariables.

يحافظ هذا على مركزية اسم المتغير ويتجنب تشتيت السلاسل النصية المرمّزة عبر قاعدة الشيفرة.

على سبيل المثال:

ts
export const MYNEWVAR = 'MYNEWVAR'

2. تسجيل الواصف في AcDbSysVarManager ​

بعد ذلك، سجّل المتغير في AcDbSysVarManager. هذه هي الخطوة التي تجعل المتغير مدعومًا فعليًا في وقت التشغيل.

عند تسجيله، حدّد:

  • اسمه
  • نوعه
  • قيمته الافتراضية
  • ما إذا كانت قيمته مخزّنة على AcDbDatabase أو في ذاكرة المدير المؤقتة فقط
  • أي وصف أو بيانات وصفية يتطلبها نموذج الواصف

هذه أهم خطوة. إذا وُجد متغير في AcDbSystemVariables فقط ولم يُسجَّل في AcDbSysVarManager، فهو مجرد ثابت اسم، وليس متغير نظام قابلًا للاستخدام.

سيسجّل AcApDocManager جميع متغيرات النظام المسجلة كأمر تلقائيًا أثناء التهيئة.

وهذا يعني أن المتغير المضاف حديثًا يمكن عادةً استخدامه من سطر الأوامر دون كتابة فئة أمر مخصصة.

ثم يصبح تدفق سطر الأوامر:

text
Command: MYNEWVAR
New value for MYNEWVAR <default>: ...

3. اختيار نموذج التخزين ​

يجب بعد ذلك تحديد ما إذا كان المتغير الجديد:

  • مقيمًا في قاعدة البيانات، إذا كان ينتمي إلى حالة الرسم أو الإعدادات الافتراضية للرسم
  • غير مرتبط بقاعدة البيانات، إذا كان ينتمي إلى سلوك المحرر أو تفضيلات واجهة المستخدم أو حالة وقت تشغيل التطبيق

إذا كان مقيمًا في قاعدة البيانات، فيجب أن يكون AcDbSysVarManager قادرًا على ربطه بحقل على AcDbDatabase.

إذا كان غير مرتبط بقاعدة البيانات، فيمكن لـ AcDbSysVarManager الاحتفاظ به في ذاكرة التخزين المؤقت الداخلية لوقت التشغيل.

كقاعدة عامة:

  • استخدم المتغيرات المقيمة في قاعدة البيانات لأشياء مثل الطبقة الحالية أو اللون الحالي
  • استخدم المتغيرات غير المرتبطة بقاعدة البيانات لأشياء مثل حجم مربع الالتقاط أو سمة الألوان

4. ربط السلوك عند الحاجة ​

إذا كان يجب أن يؤثر تغيير المتغير في واجهة المستخدم أو سلوك المحرر فورًا، فأضف المنطق المقابل في الوحدة المستهلكة.

النمط المفضل هو الاستجابة إلى sysVarChanged بدلًا من فحص المتغير يدويًا في أماكن كثيرة.

PICKBOX مثال جيد على هذا النمط:

  • المتغير مسجّل في AcDbSysVarManager
  • نظام الأوامر يعرضه في سطر الأوامر
  • يستمع AcEdCursorManager للتغييرات ويحدّث المؤشر فورًا

إذن، عمليًا، المسار الأدنى لمتغير جديد هو:

  1. تعريف اسمه في AcDbSystemVariables
  2. تسجيل واصفه في AcDbSysVarManager
  3. تحديد استراتيجية التخزين
  4. اختياريًا ربط المستمعين أو منطق الأعمال الذي يستجيب لقيمته

بعد ذلك، يمكنه المشاركة في سير العمل الموحّد نفسه getVar / setVar الذي تتبعه متغيرات النظام المدمجة.

الملخص ​

في MLightCAD، متغيرات النظام أكثر من مجرد مجموعة إعدادات غير مترابطة. إنها تشكّل تجريدًا موحّدًا لحالة التطبيق:

  • نحو الأسفل، تُخطَّط إلى حالة قاعدة بيانات متعلقة بالرسم
  • نحو الأعلى، تقود سلوك المحرر وواجهة المستخدم
  • في المنتصف، توفّر وصولًا مركزيًا وقيود أنواع وإشعارًا بالتغيير

إذا كان الأمر يجيب عن سؤال «ماذا نفعل»، فإن متغير النظام يجيب عن سؤال «تحت أي إعدادات أو وضع ينبغي فعله».