<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های lordtec</title>
        <link>https://virgool.io/feed/@sourcecity</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-17 04:44:43</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>lordtec</title>
            <link>https://virgool.io/@sourcecity</link>
        </image>

                    <item>
                <title>ماشین حساب مهندسی پیشرفته با رسم نمودار دوبعدی و سه بعدی</title>
                <link>https://virgool.io/@sourcecity/%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%AD%D8%B3%D8%A7%D8%A8-%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-%D8%A8%D8%A7-%D8%B1%D8%B3%D9%85-%D9%86%D9%85%D9%88%D8%AF%D8%A7%D8%B1-%D8%AF%D9%88%D8%A8%D8%B9%D8%AF%DB%8C-%D9%88-%D8%B3%D9%87-%D8%A8%D8%B9%D8%AF%DB%8C-endvzcn5mvgp</link>
                <description>ماشین حساب مهندسی پیشرفته با رسم نمودار دوبعدی و سه بعدی#خب اولین کارمون رایگان در اختیار شما
# scientific_calculator_3d.py
&quot;&quot;&quot;
ماشینحساب مهندسی با رسم 2D و 3D (z = f(x,y))
- امنسازی eval با توابع math و numpy محدود
- رسم دوبعدی f(x) و رسم سهبعدی z=f(x,y) با matplotlib (Axes3D)
&quot;&quot;&quot;

import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import math
import numpy as np
import matplotlib
matplotlib.use(&quot;TkAgg&quot;)
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from mpl_toolkits.mplot3d import Axes3D  # noqa: F401
import sympy as sp
import traceback

# --- امنسازی محیط eval ---
_safe_dict = {}
for name in dir(math):
    if not name.startswith(&quot;_&quot;):
        _safe_dict[name] = getattr(math, name)
# allowed numpy functions (limited)
_np_allowed = [&quot;sin&quot;, &quot;cos&quot;, &quot;tan&quot;, &quot;arcsin&quot;, &quot;arccos&quot;, &quot;arctan&quot;,
               &quot;sinh&quot;, &quot;cosh&quot;, &quot;tanh&quot;, &quot;exp&quot;, &quot;log&quot;, &quot;log10&quot;,
               &quot;sqrt&quot;, &quot;abs&quot;, &quot;pi&quot;, &quot;e&quot;, &quot;sin&quot;, &quot;cos&quot;]
for name in _np_allowed:
    if hasattr(np, name):
        _safe_dict[&quot;np_&quot;+name] = getattr(np, name)

def safe_eval&#40;expr, local_vars=None&#41;:
    if local_vars is None:
        local_vars = {}
    expr = expr.replace(&quot;^&quot;, &quot;**&quot;)
    env = dict(_safe_dict)
    # expose math names directly
    for name in dir(math):
        if not name.startswith(&quot;_&quot;):
            env[name] = getattr(math, name)
    # limited numpy as dict under &#039;np&#039;
    limited_np = {}
    for name in set(_np_allowed):
        if hasattr(np, name):
            limited_np[name] = getattr(np, name)
    limited_np[&quot;pi&quot;] = np.pi
    limited_np[&quot;e&quot;] = np.e
    env[&quot;np&quot;] = limited_np
    env.update(local_vars)
    env[&quot;__builtins__&quot;] = {}
    return eval&#40;expr, env&#41;

# --- GUI ---
class ScientificCalculator3D(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title(&quot;ماشینحساب مهندسی 2D/3D&quot;)
        self.geometry(&quot;1200x780&quot;)
        self.resizable(True, True)

        self.expr_var = tk.StringVar()
        self.result_var = tk.StringVar()
        self.plot_expr = tk.StringVar(value=&quot;sin(x)&quot;)
        self.plot3_expr = tk.StringVar(value=&quot;sin(x*y)&quot;)
        self.history = []

        self._build_ui()

    def _build_ui(self):
        top = ttk.Frame(self)
        top.pack(side=&quot;top&quot;, fill=&quot;x&quot;, padx=8, pady=6)
        entry = ttk.Entry(top, textvariable=self.expr_var, font=(&quot;Consolas&quot;, 18))
        entry.pack(side=&quot;left&quot;, fill=&quot;x&quot;, expand=True, padx=(0,6))
        entry.bind(&quot;&lt;Return&gt;&quot;, lambda e: self.evaluate())
        ttk.Label(top, textvariable=self.result_var, font=(&quot;Consolas&quot;, 14)).pack(side=&quot;right&quot;)

        main = ttk.Frame(self)
        main.pack(fill=&quot;both&quot;, expand=True)

        left = ttk.Frame(main)
        left.pack(side=&quot;left&quot;, fill=&quot;y&quot;, padx=6, pady=6)

        btns = [
            [&quot;7&quot;,&quot;8&quot;,&quot;9&quot;,&quot;/&quot;,&quot;sqrt(&quot;],
            [&quot;4&quot;,&quot;5&quot;,&quot;6&quot;,&quot;*&quot;,&quot;^&quot;],
            [&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;-&quot;,&quot;(&quot;],
            [&quot;0&quot;,&quot;.&quot;,&quot;%&quot;,&quot;+&quot;,&quot;)&quot;],
            [&quot;pi&quot;,&quot;e&quot;,&quot;ans&quot;,&quot;C&quot;,&quot;DEL&quot;]
        ]
        for r,row in enumerate(btns):
            rf = ttk.Frame(left); rf.pack(pady=2)
            for txt in row:
                ttk.Button(rf, text=txt, width=6, command=lambda t=txt: self.on_button(t)).pack(side=&quot;left&quot;, padx=2)

        func_frame = ttk.LabelFrame(left, text=&quot;Functions&quot;)
        func_frame.pack(pady=6)
        funcs = [&quot;sin(&quot;,&quot;cos(&quot;,&quot;tan(&quot;,&quot;asin(&quot;,&quot;acos(&quot;,&quot;atan(&quot;,&quot;sinh(&quot;,&quot;cosh(&quot;,&quot;tanh(&quot;,&quot;log(&quot;,&quot;log10(&quot;,&quot;exp(&quot;,&quot;abs(&quot;,&quot;factorial(&quot;]
        for i,fn in enumerate(funcs):
            ttk.Button(func_frame, text=fn.rstrip(&quot;(&quot;), width=8, command=lambda f=fn: self.on_button(f)).grid(row=i//3, column=i%3, padx=2, pady=2)

        mid = ttk.Frame(main)
        mid.pack(side=&quot;left&quot;, fill=&quot;y&quot;, padx=6, pady=6)
        ttk.Button(mid, text=&quot;=&quot;, width=20, command=self.evaluate).pack(pady=6)
        ttk.Button(mid, text=&quot;Clear All&quot;, width=20, command=self.clear_all).pack(pady=6)
        hist_frame = ttk.LabelFrame(mid, text=&quot;History&quot;)
        hist_frame.pack(fill=&quot;both&quot;, expand=True)
        self.hist_list = tk.Listbox(hist_frame, height=12, width=30)
        self.hist_list.pack(side=&quot;left&quot;, fill=&quot;both&quot;, expand=True)
        ttk.Scrollbar(hist_frame, orient=&quot;vertical&quot;, command=self.hist_list.yview).pack(side=&quot;right&quot;, fill=&quot;y&quot;)
        self.hist_list.config(yscrollcommand=lambda *args: None)
        self.hist_list.bind(&quot;&lt;Double-Button-1&gt;&quot;, self.on_history_select)

        right = ttk.Frame(main)
        right.pack(side=&quot;right&quot;, fill=&quot;both&quot;, expand=True, padx=6, pady=6)

        # Plot 2D
        plot2 = ttk.LabelFrame(right, text=&quot;Plot 2D: f(x)&quot;)
        plot2.pack(fill=&quot;x&quot;, pady=4)
        ttk.Label(plot2, text=&quot;f(x)=&quot;).grid(row=0,column=0, sticky=&quot;w&quot;)
        ttk.Entry(plot2, textvariable=self.plot_expr, width=40).grid(row=0,column=1,columnspan=3, sticky=&quot;w&quot;)
        ttk.Label(plot2, text=&quot;xmin&quot;).grid(row=1,column=0, sticky=&quot;w&quot;)
        self.xmin_var = tk.StringVar(value=&quot;-10&quot;); ttk.Entry(plot2, textvariable=self.xmin_var, width=8).grid(row=1,column=1)
        ttk.Label(plot2, text=&quot;xmax&quot;).grid(row=1,column=2, sticky=&quot;w&quot;)
        self.xmax_var = tk.StringVar(value=&quot;10&quot;); ttk.Entry(plot2, textvariable=self.xmax_var, width=8).grid(row=1,column=3)
        ttk.Label(plot2, text=&quot;samples&quot;).grid(row=2,column=0, sticky=&quot;w&quot;)
        self.samples_var = tk.IntVar(value=1000); ttk.Entry(plot2, textvariable=self.samples_var, width=8).grid(row=2,column=1)
        ttk.Button(plot2, text=&quot;Plot 2D&quot;, command=self.plot_2d).grid(row=3,column=0, pady=6)
        ttk.Button(plot2, text=&quot;Save PNG&quot;, command=self.save_plot).grid(row=3,column=1, pady=6)
        ttk.Button(plot2, text=&quot;Clear&quot;, command=self.clear_plot).grid(row=3,column=2, pady=6)

        # Plot 3D
        plot3 = ttk.LabelFrame(right, text=&quot;Plot 3D: z=f(x,y)&quot;)
        plot3.pack(fill=&quot;x&quot;, pady=4)
        ttk.Label(plot3, text=&quot;z=&quot;).grid(row=0,column=0, sticky=&quot;w&quot;)
        ttk.Entry(plot3, textvariable=self.plot3_expr, width=40).grid(row=0,column=1,columnspan=3, sticky=&quot;w&quot;)
        ttk.Label(plot3, text=&quot;xmin&quot;).grid(row=1,column=0, sticky=&quot;w&quot;)
        self.x3_min = tk.StringVar(value=&quot;-5&quot;); ttk.Entry(plot3, textvariable=self.x3_min, width=8).grid(row=1,column=1)
        ttk.Label(plot3, text=&quot;xmax&quot;).grid(row=1,column=2, sticky=&quot;w&quot;)
        self.x3_max = tk.StringVar(value=&quot;5&quot;); ttk.Entry(plot3, textvariable=self.x3_max, width=8).grid(row=1,column=3)
        ttk.Label(plot3, text=&quot;ymin&quot;).grid(row=2,column=0, sticky=&quot;w&quot;)
        self.y3_min = tk.StringVar(value=&quot;-5&quot;); ttk.Entry(plot3, textvariable=self.y3_min, width=8).grid(row=2,column=1)
        ttk.Label(plot3, text=&quot;ymax&quot;).grid(row=2,column=2, sticky=&quot;w&quot;)
        self.y3_max = tk.StringVar(value=&quot;5&quot;); ttk.Entry(plot3, textvariable=self.y3_max, width=8).grid(row=2,column=3)
        ttk.Label(plot3, text=&quot;samples (each axis)&quot;).grid(row=3,column=0, sticky=&quot;w&quot;)
        self.samples3_var = tk.IntVar(value=200); ttk.Entry(plot3, textvariable=self.samples3_var, width=8).grid(row=3,column=1)
        ttk.Button(plot3, text=&quot;Plot 3D&quot;, command=self.plot_3d).grid(row=4,column=0, pady=6)
        ttk.Button(plot3, text=&quot;Save PNG&quot;, command=self.save_plot).grid(row=4,column=1, pady=6)

        # Figure
        fig_frame = ttk.Frame(right); fig_frame.pack(fill=&quot;both&quot;, expand=True)
        self.fig = Figure(figsize=(6,5), dpi=110)
        self.ax = self.fig.add_subplot(111)  # will be replaced with 3D when needed
        self.canvas = FigureCanvasTkAgg(self.fig, master=fig_frame)
        self.canvas.get_tk_widget().pack(fill=&quot;both&quot;, expand=True)

        bottom = ttk.Frame(self); bottom.pack(side=&quot;bottom&quot;, fill=&quot;x&quot;, padx=8, pady=6)
        ttk.Label(bottom, text=&quot;برای توابع برداری از np.sin(x), np.cos(...) یا sin(...) استفاده کنید. برای 3D از متغیرهای x و y استفاده کنید.&quot;).pack(side=&quot;left&quot;)

    # buttons
    def on_button(self, text):
        if text == &quot;C&quot;:
            self.expr_var.set(&quot;&quot;)
            return
        if text == &quot;DEL&quot;:
            s = self.expr_var.get(); self.expr_var.set(s[:-1]); return
        if text == &quot;ans&quot;:
            if self.history:
                last_ans = self.history[-1][1]
                self.expr_var.set(self.expr_var.get() + str(last_ans))
            return
        if text == &quot;pi&quot;:
            self.expr_var.set(self.expr_var.get() + &quot;pi&quot;); return
        if text == &quot;e&quot;:
            self.expr_var.set(self.expr_var.get() + &quot;e&quot;); return
        if text == &quot;%&quot;:
            self.expr_var.set(self.expr_var.get() + &quot;/100&quot;); return
        self.expr_var.set(self.expr_var.get() + text)

    def clear_all(self):
        self.expr_var.set(&quot;&quot;); self.result_var.set(&quot;&quot;); self.history.clear(); self.hist_list.delete(0,tk.END); self.clear_plot()

    def on_history_select(self, event):
        sel = self.hist_list.curselection()
        if not sel: return
        idx = sel[0]; expr, val = self.history[idx]
        self.expr_var.set(expr); self.result_var.set(str(val))

    def evaluate(self):
        expr = self.expr_var.get().strip()
        if not expr: return
        try:
            val = safe_eval&#40;expr&#41;
            if isinstance(val, float) and abs(val - round(val)) &lt; 1e-12:
                val = int(round(val))
            self.result_var.set(str(val))
            self.history.append((expr, val)); self.hist_list.insert(tk.END, f&quot;{expr} = {val}&quot;)
        except Exception as e:
            messagebox.showerror(&quot;Evaluation error&quot;, f&quot;{e}\n\n{traceback.format_exc()}&quot;)

    # plotting 2D
    def plot_2d(self):
        expr = self.plot_expr.get().strip()
        if not expr:
            messagebox.showwarning(&quot;Warning&quot;, &quot;عبارت تابع خالی است.&quot;); return
        try:
            xmin = float(self.xmin_var.get()); xmax = float(self.xmax_var.get())
            if xmax &lt;= xmin: raise ValueError(&quot;xmax باید بزرگتر از xmin باشد.&quot;)
            samples = int(self.samples_var.get()); samples = max(20, samples)
            x = np.linspace(xmin, xmax, samples)
            ef = expr.replace(&quot;^&quot;, &quot;**&quot;)
            repl_map = [&quot;sin&quot;,&quot;cos&quot;,&quot;tan&quot;,&quot;arcsin&quot;,&quot;arccos&quot;,&quot;arctan&quot;,&quot;sinh&quot;,&quot;cosh&quot;,&quot;tanh&quot;,&quot;exp&quot;,&quot;log&quot;,&quot;log10&quot;,&quot;sqrt&quot;,&quot;abs&quot;]
            for fn in repl_map:
                ef = ef.replace(fn+&quot;(&quot;, &quot;np.&quot;+fn+&quot;(&quot;)
            local_vars = {&quot;x&quot;: x}
            try:
                y = safe_eval&#40;ef, local_vars=local_vars&#41;
                if np.isscalar(y): y = np.full_like(x, float(y), dtype=float)
                else: y = np.array(y, dtype=float)
            except Exception:
                y = []
                for xv in x:
                    try:
                        yv = safe_eval&#40;expr, local_vars={&quot;x&quot;: float(xv&#41;}); y.append(float(yv))
                    except Exception:
                        y.append(np.nan)
                y = np.array(y, dtype=float)

            self.fig.clf()
            self.ax = self.fig.add_subplot(111)
            self.ax.plot(x, y, label=f&quot;f(x)={expr}&quot;)
            self.ax.set_xlim(xmin, xmax); self.ax.grid(True); self.ax.legend()
            self.canvas.draw()
        except Exception as e:
            messagebox.showerror(&quot;Plot error&quot;, str(e))

    # plotting 3D
    def plot_3d(self):
        expr = self.plot3_expr.get().strip()
        if not expr:
            messagebox.showwarning(&quot;Warning&quot;, &quot;عبارت تابع خالی است.&quot;); return
        try:
            xmin = float(self.x3_min.get()); xmax = float(self.x3_max.get())
            ymin = float(self.y3_min.get()); ymax = float(self.y3_max.get())
            if xmax &lt;= xmin or ymax &lt;= ymin:
                raise ValueError(&quot;حدود x و y نامعتبرند.&quot;)
            samples = int(self.samples3_var.get()); samples = max(10, min(500, samples))
            xs = np.linspace(xmin, xmax, samples)
            ys = np.linspace(ymin, ymax, samples)
            X, Y = np.meshgrid(xs, ys)
            # prepare expression for numpy evaluation: replace functions to np.*
            ef = expr.replace(&quot;^&quot;, &quot;**&quot;)
            repl_map = [&quot;sin&quot;,&quot;cos&quot;,&quot;tan&quot;,&quot;arcsin&quot;,&quot;arccos&quot;,&quot;arctan&quot;,&quot;sinh&quot;,&quot;cosh&quot;,&quot;tanh&quot;,&quot;exp&quot;,&quot;log&quot;,&quot;log10&quot;,&quot;sqrt&quot;,&quot;abs&quot;]
            for fn in repl_map:
                ef = ef.replace(fn+&quot;(&quot;, &quot;np.&quot;+fn+&quot;(&quot;)
            local_vars = {&quot;x&quot;: X, &quot;y&quot;: Y}
            try:
                Z = safe_eval&#40;ef, local_vars=local_vars&#41;
                Z = np.array(Z, dtype=float)
            except Exception:
                # fallback pointwise (slower)
                Z = np.empty_like(X, dtype=float)
                rows, cols = X.shape
                for i in range(rows):
                    for j in range(cols):
                        xv = float(X[i,j]); yv = float(Y[i,j])
                        try:
                            zv = safe_eval&#40;expr, local_vars={&quot;x&quot;: xv, &quot;y&quot;: yv}&#41;
                            Z[i,j] = float(zv)
                        except Exception:
                            Z[i,j] = np.nan

            # plot surface
            self.fig.clf()
            self.ax = self.fig.add_subplot(111, projection=&#039;3d&#039;)
            # choose a colormap and plot_surface
            surf = self.ax.plot_surface(X, Y, Z, cmap=&#039;viridis&#039;, linewidth=0, antialiased=True)
            self.fig.colorbar(surf, ax=self.ax, shrink=0.6)
            self.ax.set_xlabel(&#039;x&#039;); self.ax.set_ylabel(&#039;y&#039;); self.ax.set_zlabel(&#039;z&#039;)
            self.ax.set_title(f&quot;z = {expr}&quot;)
            self.canvas.draw()
        except Exception as e:
            messagebox.showerror(&quot;3D Plot error&quot;, f&quot;{e}\n\n{traceback.format_exc()}&quot;)

    def save_plot(self):
        path = filedialog.asksaveasfilename(defaultextension=&quot;.png&quot;, filetypes=[(&quot;PNG&quot;,&quot;*.png&quot;)])
        if not path: return
        try:
            self.fig.savefig(path)
            messagebox.showinfo(&quot;Saved&quot;, f&quot;Saved plot to {path}&quot;)
        except Exception as e:
            messagebox.showerror(&quot;Save error&quot;, str(e))

    def clear_plot(self):
        self.fig.clf()
        self.ax = self.fig.add_subplot(111)
        self.ax.set_title(&quot;Plot&quot;); self.ax.grid(True)
        self.canvas.draw()

if __name__ == &quot;__main__&quot;:
    app = ScientificCalculator3D()
    app.mainloop()
</description>
                <category>lordtec</category>
                <author>lordtec</author>
                <pubDate>Thu, 30 Oct 2025 21:15:34 +0330</pubDate>
            </item>
                    <item>
                <title>بسم الله الرحمن الرحیم</title>
                <link>https://virgool.io/@sourcecity/%D8%A8%D8%B3%D9%85-%D8%A7%D9%84%D9%84%D9%87-%D8%A7%D9%84%D8%B1%D8%AD%D9%85%D9%86-%D8%A7%D9%84%D8%B1%D8%AD%DB%8C%D9%85-onx7lh78kxcw</link>
                <description>مرجع تخصصی سورس کدهای آماده پایتونبه دنیای بی‌نهایت پایتون خوش آمدید! آیا شما هم از آن دسته توسعه‌دهندگانی هستید که برای پیاده‌سازی ایده‌های بزرگ خود به دنبال یک نقطه شروع قوی و مطمئن می‌گردید؟ وبلاگ سورس سیتی اینجاست تا مسیر کدنویسی را برای شما کوتاه و لذت‌بخش کند.در اینجا، ما باور داریم که زمان باارزش‌ترین دارایی شماست. به همین دلیل، کتابخانه‌ای گسترده و منحصربه‌فرد از سورس کدهای آماده، حرفه‌ای و بهینه‌شده پایتون را گردآوری کرده‌ایم. چرا سورس سیتی؟صرفه‌جویی در زمان: هفته‌ها زمان توسعه را به دقیقه کاهش دهید.کدهای باکیفیت: تمام سورس کدها با بهترین پرکتیس‌ها نوشته شده، کامنت‌گذاری شده و مستندسازی گردیده‌اند.ایده‌های خود را از مرحله تصور به مرحله اجرا درآورید. برای کشف دنیایی از کدهای کاربردی، به بلاگ ما سر بزنید، از آموزش‌های ما بهره ببرید و پروژه بعدی خود را با بهترین سورس کدها کلید بزنید.سورس سیتی: کد بزن، رشد کن، درآمد داشته باش!</description>
                <category>lordtec</category>
                <author>lordtec</author>
                <pubDate>Thu, 09 Oct 2025 16:22:41 +0330</pubDate>
            </item>
            </channel>
</rss>