العمل مع KOMPAS-3D API → الدرس 10 ← أحرف خاصة بما في ذلك سلسلة

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




محتوى سلسلة الدرس "العمل مع KOMPAS-3D API"


  1. الأساسيات
  2. تصميم رسم
  3. اتصال صحيح بـ KOMPAS
  4. النقش الرئيسي
  5. البدائيون الرسم
  6. حفظ مستند بتنسيقات مختلفة
  7. التعرف على الإعدادات
  8. طرق كتابة أكثر تعقيدًا في كتلة العنوان
  9. قراءة خلايا الترجمة
  10. أحرف خاصة بما في ذلك سلسلة


أحرف خاصة بما في ذلك سلسلة



جدول العلامات الخاصة موجود في الملحق الخامس للمساعدة الرئيسية لـ KOMPAS

تتضمن الأحرف الخاصة بالأرقام 78-80 و 83 و 93-99 و 171 و 172 السلسلة. في هذه الحالة ، لا توجد السلسلة s للواجهة ksTextItemParam بعد الحرف الخاص ، ولكن بداخلها. على سبيل المثال ، يعرض حرف خاص برقم 80 النص في الإطار. فيما يلي مثال على برنامج يوضح العمل مع مثل هذه الشخصية الخاصة.

//    TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //  TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L""); TextItemParam->set_s(str); SysFreeString(str); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextItemParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

من أجل البساطة ، يحذف هذا المثال الرمز المسؤول عن إنشاء الوثيقة وتنفيذها (تمت مناقشة هذا الموضوع في الدروس السابقة للدورة). يوضح الشكل أدناه الملصق الرئيسي الذي شكله هذا البرنامج.



من أجل البساطة ، نملأ خلية واحدة فقط. يحدد الحرف الخاص برقم 98 علامة الجذر التربيعي. لاحظ أن قيمة خاصية s للواجهة ksTextItemParam تحت العلامة الجذر تمامًا. تعمل الأحرف الخاصة الأخرى ، بما في ذلك السلسلة ، بنفس الطريقة تمامًا.

الأحرف الخاصة و ksTextLineParam


لا يقتصر إجراء الأحرف الخاصة على واجهة ksTextItemParam . خذ بعين الاعتبار المثال أدناه.

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(0); str = SysAllocString(L" 3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

في هذا المثال ، يتم إدخال سطر يتكون من ثلاثة مكونات في كتلة العنوان. يحتوي الأولين على حرف خاص وسلسلة. يحتوي المكون الثالث على سلسلة فقط ، بدون حرف خاص. دعونا نلقي نظرة على نتيجة البرنامج (يظهر الشكل أدناه فقط الخط الذي تم إنشاؤه بدون النقش الرئيسي).



يرجى ملاحظة أن السطر "الصفحة 2" والسطر "الصفحة 3" تم تضمينهما في الحرف الخاص الثاني ، الذي خططنا لعرضه خارج الحرف الخاص. علاوة على ذلك ، تم تضمين كلا هذين الخطين في الحرف الخاص الأول (لم نخطط هذا أيضًا). يوضح هذا المثال نقطتين مهمتين:

  • قد تشتمل الأحرف الخاصة على أحرف خاصة أخرى ؛
  • يمتد عمل الحرف الخاص إلى جميع المكونات التي تشكل واجهة ksTextLineParam .

ينشأ سؤال معقول - هل هناك طريقة للحد من عمل الطابع الخاص؟ نعم هناك. ولكن من أجل فهم ذلك ، تحتاج أولاً إلى التعرف على واجهة ksTextItemFont .

خيارات خط مكون النص ( ksTextItemFont )


وفقًا للوثائق ، تصف واجهة ksTextItemFont معلمات الخط لمكون النص. ولكن في الواقع ، تتجاوز قدراته الوصف البسيط للخط المستخدم. تسمح لك هذه الواجهة بإنشاء خطوط مركبة (حولها - في الدروس التالية من الدورة).

يمكنك الحصول عليها بعدة طرق. أولاً ، باستخدام طريقة GetParamStruct لواجهة KompasObject : لهذا ، يجب تمرير ko_TextItemFont الثابت إلى هذه الطريقة كمعلمة فقط. ثانيًا ، باستخدام طريقة GetItemFont للواجهة ksTextItemParam . لا تحتوي هذه الطريقة على معلمات إدخال وترجع واجهة ksTextItemFont المرتبطة بالفعل بمكون النص.

خذ بعين الاعتبار خصائص واجهة ksTextItemFont .
bitvector - ناقل بسيط يحدد خصائص النص (سيتم مناقشتها بالتفصيل في الدروس القادمة من الدورة).
اللون - لون الأحرف بتنسيق RGB.
fontName - سلسلة باسم الخط.
الارتفاع - ارتفاع الخط بالملليمتر.
ksu هو عامل تمدد النص.
هناك ثلاث طرق فقط لواجهة ksTextItemFont .
تقوم Init () بإعادة تعيين كافة خصائص الواجهة. ليس لديها معلمات إدخال. في حالة نجاحها ، تُرجع TRUE ، وفي حالة الخطأ - FALSE .
GetBitVectorValue إرجاع قيمة إشارة فردية من مجموعة bitvector . تأخذ علامة كمعلمة فقط ، نريد تحديد قيمتها. إذا تم تعيينها ، ترجع الطريقة TRUE ؛ في حالة إعادة التعيين ، FALSE .
يغير SetBitVectorValue قيمة علامة واحدة. فيما يلي نموذج أولي لهذه الطريقة:

 BOOL SetBitVectorValue ( long bitVector, //  BOOL state //   ); 

إذا كانت قيمة معلمة الحالة TRUE ، فسيتم رفع إشارة bitVector ، وإلا فسيتم إعادة تعيينها.
في حالة نجاحها ، تقوم طريقة SetBitVectorValue بإرجاع TRUE ، وفي حالة حدوث خطأ ، FALSE .
تتيح لك طريقتا GetBitVectorValue و SetBitVectorValue العمل مع خاصية bitvector دون الوصول إليها مباشرة.

تحديد الأحرف الخاصة


تم تصميم علامتين للتحكم في الأحرف الخاصة. يتم سردها في الجدول أدناه.



علامة SPECIAL_SYMBOL التي أخذناها بعين الاعتبار عندما وصفنا الواجهة ksTextItemParam . هناك حاجة للإشارة - يتم عرض حرف خاص. يتم تكرار نفس العلم في خاصية bitVector الخاصة بواجهة ksTextItemFont (كما تظهر تجربتي ، فإن هذا التكرار اختياري).

العلامة الثانية ( SPECIAL_SYMBOL_END ) لا معنى لها إلا للحروف الخاصة التي تتضمن سلسلة. يلغي عمل الشخصية الخاصة. لا يتم تضمين الخطوط المعروضة بعد هذا العلم في الحرف الخاص.

يعمل الإجراء المشترك لكلا العلمين على إلغاء عمل الشخصية الخاصة. في هذه الحالة ، لن يتم عرض الحرف الخاص في المستند.

مثال


أدناه هو رمز المصدر للبرنامج المعدل. باستخدام الأعلام الموصوفة أعلاه ، تنفذ المخرج الصحيح للمكونات.

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont->Init(); TextItemFont.Unbind(); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //      TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); TextItemParam->set_type(0); str = SysAllocString(L"  3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

الفرق الوحيد بين هذا المثال والمثال السابق هو أنه بعد كل حرف خاص يتم عرض مكون يتم تعيين علامة SPECIAL_SYMBOL_END له في واجهة ksTextItemFont . الغرض الوحيد منه هو إلغاء عمل الشخصية الخاصة. في الحالة الأولى ، لا يحتوي على أي بيانات (باستثناء العلم بالطبع). وفي الحالة الثانية ، تحتوي على السلسلة "الصفحة 3" .

لا يمكنك دمج علامة SPECIAL_SYMBOL_END مع إخراج الحرف الخاص الثاني. نظرًا لأنه في هذه الحالة ، ستلغي هذه العلامة إجراء كل من الأحرف الخاصة. سيتم عرض السطر "الصفحة 2" دون يتوسطه خط.

يوضح الشكل أدناه السطر الذي يعرضه البرنامج في كتلة العنوان.



كما ترى ، الآن ينطبق عمل الأحرف الخاصة فقط على المكون "الخاص بك".

الرموز الخاصة المتداخلة


يظهر المثال الأول من درسنا اليوم بوضوح - يمكن تضمين الأحرف الخاصة في بعضها البعض. تلغي علامة SPECIAL_SYMBOL_END عمل شخصية خاصة (أخيرة). هذا يسمح لك ببناء خطوط معقدة مع أحرف خاصة مضمنة.

يوجد أدناه رمز المصدر للمثال المعدل ، حيث يتم تضمين السلسلة الفرعية "الصفحة 2" أيضًا في التعبير تحت علامة الجذر التربيعي.

 //     TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); //     DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //   TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); //   TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); //      TextItemParam->set_type(0); str = SysAllocString(L"  3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); //   ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); //    StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); //   kompas->Visible = true; kompas.Unbind(); 

يرجى ملاحظة أنه بعد استبدال السلسلة "الصفحة 2" ، نقوم بإخراج المكون مرتين بالعلامة SPECIAL_SYMBOL_END (المرة الأولى - كجزء من مكون فارغ ، والثانية - جنبًا إلى جنب مع السلسلة "الصفحة 3" ). هذا ضروري لإلغاء عمل الشخصيات الخاصة. في المرة الأولى التي نلغي فيها الحرف الخاص 169 (يتوسطه خط) ، في المرة الثانية - 98 (الجذر التربيعي). إذا عرضنا مكونًا واحدًا فقط بعلامة SPECIAL_SYMBOL_END ، فسيؤدي هذا إلى إلغاء الرمز الخاص 169 فقط ، وليس 98 . في هذه الحالة ، لن يتم شطب السطر "الصفحة 3" ، ولكن سيتم تضمينه في التعبير تحت علامة الجذر.
يوضح الشكل أدناه نتيجة هذا البرنامج.



الخلاصة

كجزء من هذا الدرس ، التقينا بشخصيات خاصة تتضمن سلسلة. كما رأيت ، فهي تختلف بشكل كبير عن الشخصيات الخاصة البسيطة (على سبيل المثال ، حروف الأبجدية اليونانية). على الرغم من أننا أظهرنا لهم مثال النقش الرئيسي ، إلا أن هذا لا ينبغي أن يربكك. يمكن استخدام هذه الأحرف في طرق إخراج النص الأخرى. سننظر في إحدى هذه الطرق في الدرس التالي.

للمتابعة ، تابع أخبار المدونة.

سيرجي نورسيف ، دكتوراه ، مؤلف كتاب "تطوير التطبيقات لـ COMPAS في دلفي".

Source: https://habr.com/ru/post/ar414701/


All Articles