مدیریت SmartArt در ارائه‌های PowerPoint با استفاده از Python

نمای کلی

SmartArt یک نمودار PowerPoint ساخته شده از گره‌ها، اشکال گره و یک طرح‌بندی است. با Aspose.Slides for Python via Java می‌توانید SmartArt ایجاد کنید، متن را از گره‌های آن بخوانید، طرح‌بندی آن را تغییر دهید، گره‌های پنهان را بررسی کنید، طرح‌بندی نمودار سازمانی را پیکربندی کنید و نمودارهای سازمانی تصویری ایجاد کنید.

دریافت متن از یک شیء SmartArt

یک گره SmartArt می‌تواند یک یا چند شکل داشته باشد. برای خواندن متن از اشکال گره، از طریق SmartArt.getAllNodes پیمایش کنید، سپس TextFrame بازگردانده شده توسط SmartArtShape.getTextFrame را بخوانید.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SmartArt

presentation = Presentation("sample.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().get_Item(0)

    if isinstance(shape, SmartArt):
        smart_art = shape
        for node in smart_art.getAllNodes():
            for node_shape in node.getShapes():
                if node_shape.getTextFrame() is not None:
                    print(node_shape.getTextFrame().getText())
finally:
    presentation.dispose()

تغییر نوع طرح‌بندی یک شیء SmartArt

طرح‌بندی SmartArt تعیین می‌کند گره‌ها چگونه چیده و به هم متصل می‌شوند. مثال زیر یک شیء SmartArt را با مقدار SmartArtLayoutType BasicBlockList ایجاد می‌کند، آن را به مقدار BasicProcess تغییر می‌دهد و ارائه را ذخیره می‌کند. موقعیت و اندازه‌ای که به ShapeCollection.addSmartArt پاس داده می‌شود بر حسب نقطه (points) اندازه‌گیری می‌شود. برای تغییر طرح‌بندی از SmartArt.setLayout استفاده کنید.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    smart_art = slide.getShapes().addSmartArt(10, 10, 400, 300, SmartArtLayoutType.BasicBlockList)
    smart_art.setLayout(SmartArtLayoutType.BasicProcess)

    presentation.save("ChangeSmartArtLayout.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

بررسی اینکه آیا گره SmartArt پنهان است

SmartArtNode.isHidden نشان می‌دهد آیا گره در مدل داده‌های SmartArt مخفی است یا خیر. گره‌های مخفی می‌توانند در ساختار وجود داشته باشند حتی زمانی که طرح‌بندی انتخاب‌شده آن‌ها را به‌عنوان عناصر نمایان نمودار نشان نمی‌دهد.

مثال زیر یک گره به شیء SmartArt که از مقدار SmartArtLayoutType RadialCycle استفاده می‌کند، اضافه می‌کند و وضعیت مخفی بودن گره اضافه‌شده را بررسی می‌کند. در صورت مخفی بودن گره، پیغامی چاپ می‌شود و نمودار ذخیره می‌شود.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    smart_art = slide.getShapes().addSmartArt(10, 10, 400, 300, SmartArtLayoutType.RadialCycle)
    node = smart_art.getAllNodes().addNode()
    is_hidden = node.isHidden()

    if is_hidden:
        print("The node is hidden in the SmartArt data model.")

    presentation.save("CheckSmartArtHiddenProperty.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

دریافت یا تنظیم طرح‌بندی نمودار سازمانی

برای نمودارهای SmartArt که از طرح‌بندی نمودار سازمانی استفاده می‌کنند، SmartArtNode.getOrganizationChartLayout و SmartArtNode.setOrganizationChartLayout نحوه چیدمان گره‌های فرزند زیر یک گره والد را مشخص می‌کنند. به‌عنوان مثال می‌توانید گره‌های فرزند را طوری تنظیم کنید که از سمت چپ، راست یا هر دو طرف آویزان شوند، بسته به مقدار انتخاب‌شدهٔ OrganizationChartLayoutType.

مثال زیر یک نمودار سازمانی ایجاد می‌کند و برای اولین گره، طرح‌بندی OrganizationChartLayoutType LeftHanging را تنظیم می‌کند. اندیس صفر مبنای صفر، اولین گره سطح بالایی را انتخاب می‌کند؛ گره‌های فرزند آن از ترتیب انتخاب‌شده استفاده می‌کنند. سپس ارائهٔ اصلاح‌شده ذخیره می‌شود.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import OrganizationChartLayoutType, Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    smart_art = slide.getShapes().addSmartArt(10, 10, 400, 300, SmartArtLayoutType.OrganizationChart)
    root_node = smart_art.getNodes().get_Item(0)
    root_node.setOrganizationChartLayout(OrganizationChartLayoutType.LeftHanging)

    presentation.save("OrganizationChartLayout.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

ایجاد نمودار سازمانی تصویر

نمودار سازمانی تصویر یک طرح‌بندی SmartArt است که برای نمودارهای سلسله‌مراتبی شامل محل‌نگهدارهای تصویر طراحی شده است. هنگام افزودن شیء SmartArt به یک اسلاید، مقدار SmartArtLayoutType PictureOrganizationChart را استفاده کنید. این مثال یک نمودار با محل‌نگهدارهای تصویر ذخیره می‌کند؛ اما این محل‌نگهدارها را با تصویر پر نمی‌کند.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    smart_art = slide.getShapes().addSmartArt(0, 0, 400, 400, SmartArtLayoutType.PictureOrganizationChart)

    presentation.save("PictureOrganizationChart.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

تبدیل نمودارهای قدیمی به گروه‌هایی از اشکال

هنگام به‌روزرسانی یک ارائهٔ موجود، ممکن است نیاز داشته باشید نمودار سازمانی که ابتدا در PowerPoint 97–2003 ایجاد شده بود را به‌روز کنید. Aspose.Slides این نمودارهای قدیمی را به عنوان اشیای LegacyDiagram نمایش می‌دهد. برای تبدیل یک نمودار به گروهی از اشکال و امکان ویرایش عناصر بصری به‌صورت جداگانه از LegacyDiagram.convertToGroupShape استفاده کنید. برای جزئیات بیشتر به LegacyDiagram API Reference مراجعه کنید.

تبدیل یک گروه جدید به مجموعهٔ اشکال اضافه می‌کند بدون این‌که نمودار اصلی حذف شود. پس از موفقیت در تبدیل، برای جلوگیری از محتوای تکراری با استفاده از ShapeCollection.remove نمودار اصلی را حذف کنید. قبل از تبدیل، نمودارهای قدیمی را در یک لیست جمع‌آوری کنید تا افزودن و حذف اشکال باعث اختلال در تکرار نشوند.

مثال زیر یک ارائه را باز می‌کند، هر اسلاید را جستجو می‌کند، نمودارها را به گروه‌هایی از اشکال تبدیل می‌کند و ارائهٔ به‌روزشده را به‌صورت PPTX ذخیره می‌کند.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LegacyDiagram, Presentation, SaveFormat

presentation = Presentation("legacy-diagrams.ppt")
try:
    for slide in presentation.getSlides():
        legacy_diagrams = []
        for shape in slide.getShapes():
            if isinstance(shape, LegacyDiagram):
                legacy_diagrams.append(shape)

        for legacy_diagram in legacy_diagrams:
            group_shape = legacy_diagram.convertToGroupShape()

            if group_shape is not None:
                slide.getShapes().remove(legacy_diagram)

    presentation.save("modernized.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

ارائهٔ ذخیره‌شده شامل گروه‌های قابل ویرایش از اشکال به‌جای نمودارهای قدیمی تبدیل‌شده است و دیگر هیچ نمودار اصلی‌ای در کنار آن‌ها وجود ندارد. فایل PPTX را در PowerPoint باز کنید تا عناصر فردی داخل هر گروه، مانند متن، رنگ‌پر یا موقعیت آن‌ها را ویرایش کنید.

پرسش‌های متداول

آیا SmartArt از آینه‌سازی یا معکوس‌سازی برای زبان‌های راست به چپ (RTL) پشتیبانی می‌کند؟

بله. متد SmartArt.setReversed جهت نمودار را از چپ به راست به راست به چپ یا بالعکس تغییر می‌دهد، به‌شرطی که طرح‌بندی SmartArt انتخاب‌شده از معکوس‌سازی پشتیبانی کند.

چگونه می‌توانم SmartArt را در همان اسلاید یا در ارائهٔ دیگری کپی کنم در حالی که قالب‌بندی حفظ می‌شود؟

می‌توانید یک نسخه از شکل SmartArt ایجاد کنید با استفاده از ShapeCollection.addClone یا یک نسخه از کل اسلاید ایجاد کنید که SmartArt را شامل می‌شود. هر دو روش اندازه، موقعیت و قالب‌بندی را حفظ می‌کنند.

چگونه می‌توانم SmartArt را به یک تصویر رستر برای پیش‌نمایش یا خروجی وب رندر کنم؟

اسلاید را رندر کنید یا کل ارائه را به PNG یا JPEG تبدیل کنید. SmartArt به‌عنوان بخشی از اسلاید رندر می‌شود.

چگونه می‌توانم یک شیء SmartArt خاص را در یک اسلاید پیدا کنم اگر چندین مورد وجود داشته باشد؟

از Shape.setAlternativeText یا Shape.setName برای اختصاص متن جایگزین یا نام متمایزی به شکل SmartArt استفاده کنید، سپس آن مقدار را در BaseSlide.getShapes جستجو کنید و سپس بررسی کنید که شکل یافت‌شده یک SmartArt باشد.