Skip to main content

manim-fa-chemistry (نسخه‌ی فارسی)

این ریپو نسخه‌ی فارسی‌سازی‌شده‌ی manim-Chemistry است که برای کار با پلاگین manim-fa بازنویسی شده تا بتوان با آن ویدیوهای آموزشی شیمی به زبان فارسی ساخت. جدول تناوبی، نام‌گذاری مولکول‌ها و فرمول‌های شیمیایی اکنون از فونت Vazirmatn و رندر راست‌چین صحیح (به کمک FaText) پشتیبانی می‌کنند؛ بقیه‌ی رفتار کتابخانه (پارس فایل‌های .mol/.sdf/...، مولکول‌های سه‌بعدی، اوربیتال‌ها و نمودار بور) بدون تغییر و کاملاً سازگار با نسخه‌ی فعلی Manim (v0.21) باقی مانده است.

مثال سریع فارسی

from manim import *
from manim_fa_chemistry import *

class PeriodicTableFa(Scene):
    def construct(self):
        # به‌صورت پیش‌فرض از داده‌های فارسی (Elements_FA.csv) استفاده می‌کند
        self.add(PeriodicTable())

class NamedMoleculeFa(Scene):
    def construct(self):
        morphine = NamedMolecule.from_mol_file(
            name="مورفین",
            filename="morphine.mol",
        )
        self.add(morphine)

class NamedFormulaFa(Scene):
    def construct(self):
        self.add(NamedFormula(metal_name="سدیم", non_metal_name="کلرید", formula="NaCl"))

برای استفاده از داده‌های انگلیسی اصلی، فایل Elements_EN.csv را به‌صورت دستی به PeriodicTable(data_file=...) بدهید.


مستندات

برای توضیحات کامل‌تر، مستندات پروژه‌ی اصلی (به انگلیسی) را ببینید.

فهرست مطالب:

نصب

می‌توانید با pip نصب کنید:

pip install manim-fa-chemistry

یا ریپو را کلون کرده و از همان‌جا نصب کنید:

git clone https://github.com/Tabesh2020/manim-fa-chemistry.git
cd manim-fa-chemistry
python -m pip install .

یا

git clone https://github.com/Tabesh2020/manim-fa-chemistry.git
cd manim-fa-chemistry
python -m pip install -e .

اگر پکیج را قبلاً نصب کرده‌اید و فقط می‌خواهید آن را به آخرین نسخه به‌روزرسانی کنید:

python -m pip install --upgrade manim-fa-chemistry

manim-Chemistry چیست؟

manim-Chemistry یک پلاگین برای Manim است که ساخت انیمیشن‌های شیمی را آسان‌تر می‌کند.

تا جایی که نویسنده‌ی اصلی اطلاع دارد، تنها پلاگین دیگر مرتبط با شیمی chanim است که تلاش می‌کند پکیج chemfig را به Manim وارد کند (و کار فوق‌العاده‌ای هم انجام می‌دهد!).

فلسفه‌ی manim-Chemistry مسیر متفاوتی را دنبال می‌کند: این پلاگین سعی می‌کند ابزارهای Manim را با فایل‌های داده‌ی شیمیایی (.mol، .sdf، .json، .asnt و .xlm) ترکیب کند تا با کلاس‌هایی ساده اما کاربردی، انیمیشن‌های زیبای شیمیایی مثل جدول تناوبی یا ساختارهای دو و سه‌بعدی بسازد.

همچنین، manim-Chemistry تلاش می‌کند تا حد امکان همه‌چیز را از صفر بسازد. یعنی از کتابخانه‌هایی مثل Mendeleev، RDKit، PyMOL، Open Babel و مانند آن‌ها پرهیز می‌شود. دلیلش این است که وابستگی به پکیج‌های شخص‌ثالثی که ممکن است نگهداری سنگینی بخواهند، کم شود. با این حال، کاربران می‌توانند قدرت آن کتابخانه‌ها را با manim-Chemistry ترکیب کنند تا کارشان راحت‌تر شود. تنها کتابخانه‌ی شخص‌ثالثی که استفاده شده PubChem است، به‌خاطر سادگی وارد کردن مستقیم مولکول‌ها از وب‌سایتش.

پروژه‌ی اصلی هنوز در حال توسعه است و تاریخ مشخصی برای انتشار نهایی ندارد.

manim-Chemistry الان چه کارهایی می‌تواند بکند؟

در ادامه خلاصه‌ای از قابلیت‌های manim-Chemistry آمده است. چون پروژه‌ی اصلی هنوز در حال توسعه است، ممکن است این خلاصه کاملاً به‌روز نباشد. برای دید بهتر، نمونه‌کارها (examples) را ببینید. همچنین فایل TODO می‌تواند نشان بدهد چه چیزهایی در راه است. اگر پیشنهادی برای پلاگین اصلی دارید، در ریپوی upstream ایشو یا پول‌ریکوئست باز کنید.

ساخت مولکول‌های دوبعدی

برای ساخت مولکول دوبعدی فقط کافی است یک فایل .mol با داده‌ی اتم‌ها و پیوندها داشته باشید. فایل morphine.mol داخل پوشه‌ی examples را ببینید تا بدانید ساختار فایل چه شکلی باید باشد.

برای ساخت یک صحنه با یک مولکول دوبعدی، ساختار کد باید این‌طور باشد:

from manim import *
from manim_fa_chemistry import *

class TwoDMoleculeScene(Scene):
   def construct(self):
        morphine = MMoleculeObject.molecule_from_file("morphine.mol")
        self.add(morphine)

مثل همیشه می‌توانید Manim را اجرا کنید:

manim .\examples.py -ps

نتیجه این‌طوری می‌شود:

plot

خیلی خوب به نظر نمی‌رسد، درسته؟ پیوندهای دوگانه در جای درستی قرار نگرفته‌اند. می‌توانیم این را حل کنیم!

می‌توانید یک گزینه را روی True بگذارید تا شماره‌ی پیوندها را ببینید. کار مشابهی هم برای اتم‌ها می‌توانید انجام دهید. این شماره‌گذاری از فایل .mol می‌آید و ربطی به ساختار شیمیایی ندارد.

from manim import *
from manim_fa_chemistry import *

class TwoDMoleculeScene(Scene):
   def construct(self):
        morphine = MMoleculeObject.molecule_from_file("morphine.mol", add_bonds_numbering=True)
        self.add(morphine)

نتیجه:

plot

پس باید پیوندهای شماره‌ی ۷ و ۲۰ را بچرخانیم. می‌توانیم با اضافه کردن اندیس آن‌ها به لیست rotate_bonds این کار را انجام دهیم:

from manim import *
from manim_fa_chemistry import *

class TwoDMoleculeScene(Scene):
   def construct(self):
        morphine = MMoleculeObject.molecule_from_file("morphine.mol", rotate_bonds=[7, 20])
        self.add(morphine)

نتیجه: plot

حالا شد!

مولکول‌های نام‌گذاری‌شده (Named Molecules):

شاید بخواهید به یک مولکول یک نام هم اضافه کنید. کار بسیار ساده‌ای است، اما انجام همه‌چیز در یک آبجکت واحد راحت است. می‌توانید یک NamedMolecule بسازید، شبیه به همان روشی که یک MMoleculeObject می‌سازید:

from manim import *
from manim_fa_chemistry import *

class NamedMoleculeExample(Scene):
    def construct(self):
        named_molecule = NamedMolecule.molecule_from_file(name="مورفین", filename="morphine.mol")
        self.add(named_molecule)

plot

می‌توانید یک مولکول یا یک متن از پیش ساخته‌شده هم بدهید و کلاس NamedMolecule آن‌ها را با هم گروه می‌کند. این کنترل بیشتری به کاربر می‌دهد.

GraphMolecule:

یک نوع دیگر از مولکول‌های دوبعدی، GraphMolecule است. این‌ها بر پایه‌ی کلاس Graph در Manim ساخته شده‌اند که قابلیت‌های زیادی به آن‌ها می‌دهد!

می‌توانید تقریباً به همان شکلی که با MMolecule و NamedMolecule کار کردید، از این‌ها هم استفاده کنید:

from manim import *
from manim_fa_chemistry import *

class GraphMoleculeExample(Scene):
    def construct(self):
        graph_molecule = GraphMolecule.molecule_from_file(filepath="morphine.mol")
        self.add(graph_molecule)

plot

بفرمایید!

همچنین می‌توانید با تنظیم label=True هنگام ساخت GraphMolecule، برچسب هم اضافه کنید:

from manim import *
from manim_fa_chemistry import *

class GraphMoleculeExample(Scene):
    def construct(self):
        graph_molecule = GraphMolecule.molecule_from_file(
            mol_file="morphine.mol",
            label=True
        )
        self.add(graph_molecule)

plot

با استفاده از label=True و numeric_label=True مولکول را با اتم‌های برچسب‌خورده بر اساس فایل mol می‌گیرید:

from manim import *
from manim_fa_chemistry import *

class GraphMoleculeExample(Scene):
    def construct(self):
        graph_molecule = GraphMolecule.molecule_from_file(
            mol_file="morphine.mol",
            label=True,
            numeric_label=True
        )
        self.add(graph_molecule)

plot

انتخاب بخشی از مولکول و انیمیشن‌های سفارشی در GraphMolecule:

قدرت گراف‌ها واقعاً در GraphMolecule نمایان می‌شود. یکی از نمونه‌های این قدرت استفاده از networkx برای گرفتن بخشی از مولکول با مشخص کردن اتم شروع و پایان است. مثلاً می‌توانیم بخشی از مولکول را رنگ کنیم:

class GraphMoleculeExample(Scene):
    def construct(self):
        molecule = GraphMolecule.molecule_from_file(asset, label=True, numeric_label=True)
        atoms_and_bonds = molecule.get_connected_atoms_and_bonds(1, 3)
        atoms_and_bonds.set_color(GREEN)
        self.add(molecule)

plot

همچنین می‌توانید با GMAnimationBuilder انیمیشن‌های سفارشی هم بسازید: rotate_atoms_about_bond و change_color:

plot

ساخت مولکول سه‌بعدی:

ساخت یک مولکول سه‌بعدی کمی تلاش بیشتری می‌خواهد. به دو چیز نیاز داریم:

۱. یک فایل .mol (مثل قبل) ۲. یک فایل داده‌ی csv با داده‌ی اتم‌ها. نمونه‌ای از آن را داخل پوشه‌ی examples با نام "Elementos.csv" پیدا می‌کنید.

فایل .mol پارس می‌شود و فایل csv برخی داده‌ها، مخصوصاً رنگ، را به manim-Chemistry می‌گوید. با استفاده از همان فایل قبلی می‌توانیم یک ساختار سه‌بعدی برای مورفین بسازیم:

from manim import *
from manim_fa_chemistry import *

class Draw3DMorphine(ThreeDScene):
    def construct(self):
        config.renderer = "opengl"
        three_d_morphine = ThreeDMolecule.molecule_from_file("morphine.mol")
        self.add(three_d_morphine)
        self.wait()

برای اجرای این کد باید Manim را با رندرر opengl اجرا کنید:

manim .\examples.py Draw3DMorphine -ps --renderer=opengl

نتیجه این است!

plot

ساخت جدول تناوبی:

مثل قبل، برای رسم همه‌چیز به یک فایل منبع نیاز داریم. باز هم می‌توانید فایل خودتان را از روی یک کپی از "Elementos.csv" بسازید.

می‌توانید قاب یک عنصر را این‌طور بسازید:

from manim import *
from manim_fa_chemistry import *

class DrawCarbonElement(Scene):
    def construct(self):
        carbon = MElementObject.from_csv_file_data(filename="Elementos.csv", atomic_number=6)
        self.add(carbon)

و همینه!

plot

برای ساخت کل جدول تناوبی، باید داده‌ی هر عنصر داخل آن فایل منبع باشد. فایل Elementos.csv از قبل این داده را دارد، پس فقط کافیست آن را کپی کرده و متناسب با نیازتان تغییر دهید. با رنگ‌بندی cpk و کد زیر، آن جدول تناوبی زیبا را می‌گیریم:

from manim import *
from manim_fa_chemistry import *

class DrawPeriodicTable(Scene):
    def construct(self):
        self.add(PeriodicTable(data_file="Elementos.csv"))

plot

ساخت اوربیتال‌های اتمی:

اوربیتال‌های مولکولی برای یک اسکریپت پایتون ساده بسیار پیچیده و سنگین هستند، اما می‌توانیم اوربیتال‌های اتمی را با انتخاب سطح l و m به‌سادگی بگیریم:

from manim import *
from manim_fa_chemistry import *

class DrawPOrbital(Scene):
    def construct(self):
        orbital = Orbital(l=1, m=-1)
        self.add(orbital)

این‌جا هم باید از رندرر opengl استفاده کنید:

manim .\examples.py DrawPOrbital -ps --renderer=opengl

plot

ساخت نمودار بور:

نمودارهای بور خیلی قدیمی‌اند، اما رسم آن‌ها می‌تواند برای انتقال برخی ایده‌ها مفید باشد. این‌جا فقط کافی است تعداد پروتون، الکترون و نوترون را مشخص کنید تا یک نمودار زیبا بگیرید:

from manim import *
from manim_fa_chemistry import *

class DrawBohrDiagram(Scene):
    def construct(self):
        diagram = BohrAtom(e=14, p=14, n=10)
        self.add(diagram)

نمودار زیبای‌تان را داشته باشید!

plot

نمونه‌کارها:

داخل این ریپو یک پوشه‌ی examples با فایل‌ها و دارایی‌های پایه وجود دارد که ممکن است مفید باشند. حتماً آن‌ها را ببینید!

ساخته‌شده با manim_fa_chemistry

چند نمونه از کارهای ساخته‌شده با manim_fa_chemistry را ببینید. خوشحال می‌شویم انیمیشن‌ها و ویدیوهای خودتان را هم به این لیست اضافه کنید!

فولرین: plot

ساختارهای بتا و آلفای قلع: plot

ویدیوهایی با manimChemistry:

https://www.youtube.com/watch?v=L7OXe94_WmA

https://youtu.be/KgiCl_o_Aws

راه ارتباطی

این ریپو فورک فارسی manim-fa-chemistry است — برای مشکلات مربوط به فارسی‌سازی (برچسب‌ها، فونت، یکپارچه‌سازی FaText)، لطفاً در Tabesh2020/manim-fa-chemistry ایشو باز کنید.

برای پروژه‌ی اصلی و upstream یعنی manim-Chemistry، می‌توانید همان‌جا ایشو یا پول‌ریکوئست باز کنید، یا مستقیم با نویسنده‌ی اصلی تماس بگیرید:

مشارکت‌کنندگان بزرگ!

تشکر ویژه از @Rodrigo-Tenorio برای کمکش در ساخت نسخه‌ی قابل‌انتشار این پکیج.

Release files for manim-fa-chemistry 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for manim-fa-chemistry 0.2.0
File Size Uploaded
manim_fa_chemistry-0.2.0.tar.gz 6.2 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for manim-fa-chemistry 0.2.0
File Interpreter ABI Platform
manim_fa_chemistry-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 6.2 MB

Release files / manim_fa_chemistry-0.2.0.tar.gz

Download URL manim_fa_chemistry-0.2.0.tar.gz
Size 6.2 MB
Tags Source
SHA-256 checksum
How to use checksums
9816c0a5b59835c58a0db03446af5d2781d90e718e32be9b21d7a3b815dc735d
BLAKE2b-256 checksum
How to use checksums
efb98e3c6bf12cbe8c93fa5df8811b5ed146a807cbdf16e0320d29278f46b68c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release files / manim_fa_chemistry-0.2.0-py3-none-any.whl

Download URL manim_fa_chemistry-0.2.0-py3-none-any.whl
Size 77.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
80ab9681958f0b9420d39dea95419994f4009e911753aa38a78afdcd2a24a607
BLAKE2b-256 checksum
How to use checksums
c111fe4e9ecef334133037ac312fde7a487612b4a1e95d6d60f7709bfa054a39
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page