العمل مع KOMPAS-3D API → الدرس 15 → الخطوط المركبة بناءً على الفقرة

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



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


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

الانحرافات العلوية والسفلية


التالي عبارة عن جزء من برنامج يوضح إخراج سطر مع الانحرافات العلوية والسفلية باستخدام الفقرات. لتحقيق ذلك ، يتم استخدام الإشارات END_DEVIAT و LOWER_DEVIAT و UPPER_DEVIAT ، المذكورة في الدرس 12 .

مقتطف رمز البرنامج
//     DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(UPPER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(LOWER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_DEVIAT); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


بالمقارنة مع مثال تكوين الانحرافات من الدرس 12 ، فإن البرنامج الحالي له ميزتان مهمتان:

  1. ويستخدم القدرات الموثقة لنظام COMPASS.
  2. لا حاجة لإعادة حساب موضع الصفوف. KOMPAS نفسها تحدد جميع الإزاحات اللازمة.

لاحظ استخدام علامة END_DEVIAT . يتم إكمال إنشاء الانحراف وإلغاء إشارات LOWER_DEVIAT و UPPER_DEVIAT . إذا لم نستخدمها ، فسيتم عرض السطر "نص بعد الانحرافات" على شكل الانحراف السفلي.

الإشارات LOWER_DEVIAT و UPPER_DEVIAT تلغي بعضها البعض. عند استخدامها في وقت واحد ، يتم إخراج السلسلة حيث سيتم عرضها دون تحديد هذه العلامات.

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

تظهر نتيجة البرنامج في الشكل أدناه.



لقطة


التالي مثال عن برنامج يوضح إخراج سلسلة تتضمن الكسر.

مثال البرنامج
 //     DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


يختلف بناء الكسر قليلاً عن بناء الانحرافات. الفرق الوحيد هو الأعلام المستخدمة. علامة END_FRACTION تلغي إشارات NUMERATOR و DENOMINATOR وتعمل بنفس علامة END_DEVIAT للانحرافات.
يوضح الشكل أدناه نتيجة هذا البرنامج.



يبدو هذا السطر أكثر إتقانًا مقارنة بنفس النص في الدرس 12 .

التحكم في حجم الكسر


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



إذا حددت خاصية iSNumb قيمة غير صالحة ، فإن KOMPAS تستخدم الارتفاع الافتراضي.

التالي مثال على استخدام علامة FRACTION_TYPE .

مثال على استخدام العلم
 //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); itemParam->set_type(FRACTION_TYPE); itemParam->set_iSNumb(3); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


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



ملاحظة: يتم ضبط حجم الكسر عند عرض البسط. كما توضح تجاربي ، يتم تجاهل حجم الكسر المحدد عند عرض المقام.

مرتفع و Substring



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



التالي هو برنامج مثال يوضح إخراج سلسلة مع سلسلة فرعية و فرعية.

مثال البرنامج
 //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


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



لا يمكنك إنشاء سلسلة فرعية و فرعية باستخدام الأسلوب ksDocument2D :: ksText .

التحكم في حجم الصف الرئيسي


يمكن أن يكون للخط الرئيسي حجم مختلف ، والذي يمكن تغييره باستخدام واجهة ksTextItemParam . لهذا ، يتم تحديد ثابت SUM_TYPE في خاصية الكتابة الخاصة به ، والحجم المطلوب للصف الرئيسي في خاصية iSNumb . تظهر القيم الصالحة في الجدول أدناه:



إذا كانت خاصية iSNumb تحتوي على قيمة غير صالحة ، فإن KOMPAS تستخدم القيمة الافتراضية.

فيما يلي مقتطف من برنامج يوضح استخدام ثابت SUM_TYPE .

مقتطف البرنامج
 //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); itemParam->set_type(SUM_TYPE); itemParam->set_iSNumb(2); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); itemParam->set_type(0); itemParam->set_iSNumb(0); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 



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

يوضح الشكل أدناه نتيجة البرنامج (قارنه بنتيجة المثال السابق).



ثابت SUM_TYPE يسمح لك بتغيير حجم السلسلة الرئيسية ، ولكن ليس سلاسل فرعية و substrings. لا يتم توفير تغيير أحجامها في KOMPAS.

شخصيات خاصة بما في ذلك سلسلة فرعية


يمكن أن تتعامل الفقرة مع الأحرف الخاصة التي تتضمن سلسلة (تمت مناقشتها في الدرس 10 من الدورة). التالي جزء من برنامج يوضح استخدامها في فقرة.

مقتطف البرنامج
 //  DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); DynamicArrayPtr lines; lines = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_LINE_ARR)); lines->ksClearArray(); //   TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; //     itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(169); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; //   itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); //     itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(96); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; //   itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); //   itemFont->set_bitVector(NEW_LINE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemParam.Unbind(); lineParam.Unbind(); itemFont.Unbind(); items.Unbind(); //    ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); paragraphParam->set_width(60.0); paragraphParam->set_hFormat(2); //    TextParamPtr textParam = static_cast<TextParamPtr>(kompas->GetParamStruct(ko_TextParam)); textParam->SetParagraphParam(paragraphParam); textParam->SetTextLineArr(lines); //  Document2D->ksTextEx(textParam, 1); lines->ksDeleteArray(); lines.Unbind(); paragraphParam.Unbind(); textParam.Unbind(); 


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



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

يتم استخدام العلامة SPECIAL_SYMBOL_END فقط للأحرف الخاصة التي تحتوي على سلسلة فرعية. للشخصيات الخاصة العادية ، ليست هناك حاجة.

يوضح الشكل أدناه نتيجة مثالنا.



استنتاج

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

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

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

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


All Articles