# Coding Reference

AugeLab'da sağlanan örnek özel blok scripti:

{% code title="Example\_Block code" %}

```python
## Bootstrap phase
from studio.custom_block import *
# Importing of community modules 
import cv2
import numpy as np

## Class Definition 
class Example_Block(Block):
	op_code = 'Example_Block' # DO NOT CHANGE !!!, must be same as class name

	def init(self):
		self.width = 200
		self.height = 120
		self.tooltip = 'Increment image values by one.'

		self.input_sockets = [SocketTypes.ImageAny('in1')]
		self.output_sockets = [SocketTypes.ImageAny('out1')]

		self.param['text1'] = TextInput(text= '5')

	def run(self):
		in1 = self.input['in1'].data
		self.output['out1'].data = in1 + 1


add_block(Example_Block.op_code, Example_Block)

```

{% endcode %}

<figure><img src="/files/Vk01JfBN7AG8G6hX8gKW" alt=""><figcaption><p>Örnek Özel Blok</p></figcaption></figure>

## Bootstrap Aşaması <a href="#bootstrap-phase" id="bootstrap-phase"></a>

### Zorunlu İçe Aktarmalar <a href="#mandatory-imports" id="mandatory-imports"></a>

Örnek script her zaman belirli modüllerin içe aktarılmasıyla başlar. `studio.custom_block import *`, blokunuzda kullanmanız için gerekli süper sınıfları, widget'ları ve yöntemleri içe aktarır. Bu satır, tüm sınıf tanımlamaları için zorunludur.

### Topluluk Modüllerinin İçe Aktarılması <a href="#importing-community-modules" id="importing-community-modules"></a>

Burada, en çok kullanılan iki kütüphane zaten sizin için içe aktarılmak üzere ayarlanmıştır. Özel bloklarınızda OpenCV ve numpy kütüphanelerini kullanabilirsiniz.

Özel kütüphaneleri de İçe Aktar Paket Penceresi ile yükleyerek içe aktarabilir ve özel statik değişkenleri ayarlayabilirsiniz.

{% hint style="warning" %}
AugeLab Studio'da sağlanan tüm bloklar çapraz platform uyumludur. Ancak, topluluk modüllerinin kullanılması bu uyumu tehlikeye atabilir.
{% endhint %}

## Sınıf Tanımı <a href="#class-definition" id="class-definition"></a>

Sınıfınızın adı, Blok Adı metin düzeninde sağladığınız [başlığa](#block-name) bağlı olarak belirlenir. Bu bölümde istediğiniz gibi nitelikler veya yöntemler tanımlayabilirsiniz.

### Sınıf Nitelikleri-Yöntemleri <a href="#class-attributes-methods" id="class-attributes-methods"></a>

### \`Block.op\_code: str\` <a href="#blockop_code-str" id="blockop_code-str"></a>

`op_code`, özel bloğunuz için benzersiz bir tanımlayıcı dizesini tanımlar. Özel bloğunuzu yüklemek için, kendinize özel bir blok adı seçmelisiniz.

### \`Block.tooltip: str\` <a href="#blocktooltip-str" id="blocktooltip-str"></a>

`tooltip`, kullanıcıların özel bloklar üzerinde fare ile gezindiğinde ipucu gösterilmesini sağlar.

<figure><img src="/files/Z9O5EhUMsgiyEHIZqICy" alt=""><figcaption><p>Özel blokta gösterilen ipucu</p></figcaption></figure>

### \`Block.input\_sockets: list\[SocketType]\` <a href="#blockinput_sockets-listsockettype" id="blockinput_sockets-listsockettype"></a>

`input_sockets` niteliği soket türlerini depolar. Her soket türü, [Giriş Soketi](#input-socket-list) veya [Çıkış Soketi](#output-socket-list) bölümünde sizin için otomatik olarak oluşturulur.

`SocketType`, iki argüman alır:

```python
...
SomeSocketClass(SocketTypes.BaseSocketClass):
    def __init__(self, name: str = '', multiple: bool = False):
        ''' 
            name: Soket grafiklerinin yanında gösterilen metin
            multiple: Bir tür listesini belirtmek için yatay bir çizgi çizer.
        '''
        ...
```

`SocketType` listesi aşağıda görülebilir:

* \[`ImageAny`]`: ImageRGB | ImageGray`
* \[`ImageRGB`]`: npt.NDArray[np.uint8] # [N, N, 3]`
* \[`ImageGray`]`: npt.NDArray[np.uint8] # [N, N]`
* \[`Integer`]`: int`
* \[`Float`]`: int`
* \[`Number`]`: float | int`
* \[`Boolean`]`: bool`
* \[`String`]`: str`
* \[`Generic`]`: object`
* \[`Shape`]`: list[list[int, int], ...]`
* \[`Pixel`]`: tuple[int] | tuple[int, int, int]`
* \[`Point`]`: tuple[int, int]`

### \`Block.output\_sockets: list\[SocketType]\` <a href="#blockoutput_sockets-listsockettype" id="blockoutput_sockets-listsockettype"></a>

Bu bölümde de [Giriş soketleri](#block.input/_sockets-list-sockettype) üzerindeki aynı kurallar geçerlidir.

### \`Block.param: dict\[str, Component]\` <a href="#blockparam-dictstr-component" id="blockparam-dictstr-component"></a>

Bu özellik, blok bileşenlerinizi ve etkileşimli widget'ları benzersiz adlarıyla tutar. Kullanabileceğiniz birkaç bileşen vardır:

* [Metin Girişi](#text-input)
* [Açılır Liste](#drop-down-list)
* [Etiket Metin](#label)
* [Kaydırıcı](#slider)
* [Etiketli Kaydırıcı](#slider-labeled)
* [Onay Kutusu](#checkbox)
* [Düğme](#button)
* [Görüntü](#image)
* [Tablo](#table)

### \`Block.input: dict\[str, object]\` <a href="#blockinput-dictstr-object" id="blockinput-dictstr-object"></a>

`input` özelliği, özel bloğunuza veri aktarımı için dinamik bir `dict`'dir. Soket adları aracılığıyla giriş soketlerinizden veri alabilirsiniz.

```python
...
class Example_Block(Block):
    ...
    def init(self):
        ...
        self.input_sockets = [SocketTypes.ImageAny('Image'),
                              SocketTypes.Number('Constant')]
        ...
        
    def run(self):
        image = self.input['Image'].data
        constant = self.input['Image']
        ...
```

### \`Block.output: dict\[str, object]\` <a href="#blockoutput-dictstr-object" id="blockoutput-dictstr-object"></a>

`output` özelliği, özel bloğunuzdan veri dışarı aktarmak için dinamik bir `dict`'dir. Çıkış soketlerinize veri yerleştirirken benzersiz soket adlarını kullanabilirsiniz.

```python
...
class Example_Block(Block):
    ...
    def init(self):
        ...
        self.output_sockets = [SocketTypes.ImageAny('Result'),
                              SocketTypes.Number('Detections')]
        ...
        
    def run(self):
        ...
        self.output['Result'].data = img_detections_drawn
        self.output['Detections'].data = n_detections
        
```

### \`Block.register\_resource(name: str = '', path: str = '') -> str\` <a href="#blockregister_resourcename-str-path-str-str" id="blockregister_resourcename-str-path-str-str"></a>

Yolları kaydeder ve bunları otomatik olarak senaryo dosyasına kaydeder.

Genellikle, düz yollar kullanmak, senaryo dosyalarını farklı bilgisayarlar arasında taşırken sorun yaratabilir. Ancak, otomatik kaynak yönetimi kullanarak genel veya göreli yolları kullanabilirsiniz. Kaynağı senaryo dosyasından daha düşük bir yolda depolamak, scriptinizin doğru yolu almasına olanak tanır.

<mark style="color:blue;">**Argümanlar:**</mark>

`name: str` **:** Bir yolu ayırt etmek için sağlanan benzersiz ad.

`path: str`**:** Kaydedilecek yol.

<mark style="color:blue;">**Döndürür:**</mark>

`path: str`**:** Kaydedilmiş yol.

Sağlanan yolu almak için [`get_resource`](#block.get/_resource-name-str-greater-than-str) yöntemini kullanın.

### \`Block.get\_resource(name: str = '') -> str\` <a href="#blockget_resourcename-str-str" id="blockget_resourcename-str-str"></a>

Özel blok içindeki kaynak yöneticisine sağladığınız kaynağı almanıza olanak tanır.

<mark style="color:blue;">**Argümanlar:**</mark>

`name: str` : Bir yolu ayırt etmek için sağlanan benzersiz ad.

<mark style="color:blue;">**Döndürür:**</mark>

`path: str`: Kaydedilen yol.

Bir yolu kaydetmek için [`register_resource`](#block.register/_resource-name-str-path-str-greater-than-str) yöntemini kullanın.

### \`Block.init(self)\` <a href="#blockinitself" id="blockinitself"></a>

Bu bölüm, özel bir blok sürüklenip bırakıldığında, kopyalanıp yapıştırıldığında veya yeni bir senaryoda yüklendiğinde her seferinde gerçekleştirilir. Bu bölümde genellikle şunları yapmak önerilir:

* Özel blok için kaynaklar yüklemek
* Kullanılacak bileşenleri tanımlamak (metin girişleri, düğmeler vb.)
* Çalışma zamanında değişen iç blok durumları.

### \`Block.run(self)\` <a href="#blockrunself" id="blockrunself"></a>

Run yöntemi, AugeLab Studio'da bir senaryonun her adımında yürütülür. Özel bloklarınızın iç durumlarını, özel modülleri, sabitleri vb. kullanabilirsiniz.

Girişleri, süper `Block` sınıfının sağladığı dinamik özellikleri kullanarak alabilir ve çıktılar gönderebilir, bileşenlerinizin yapılandırmalarını değiştirebilir ve doğru yürütme mantığını seçmek için bileşen durumunu okuyabilirsiniz.

### \`QAFileDialog\` <a href="#qafiledialog" id="qafiledialog"></a>

QAFileDialog, kullanıcılara dosya yolu seçme diyaloğu sunan statik bir sınıftır:

#### \`QAFileDialog.getOpenFileName(\*\*kwargs)\` <a href="#qafiledialoggetopenfilenamekwargs" id="qafiledialoggetopenfilenamekwargs"></a>

<mark style="color:blue;">Argümanlar</mark>

`caption: str = ''`: Dosya diyalog başlığının başlığı

`directory: str = ''`: Diyalogun başlangıç dizini

`filter: str = ''`: Filtrelenecek dosya adları, örneğin -> `'Görüntü Dosyaları (*.png *.jpg *.bmp)'`

<mark style="color:blue;">Döndürür</mark>

`path:str`: Kullanıcı tarafından seçilen yol.

#### \`QAFileDialog.getExistingDirectory\` <a href="#qafiledialoggetexistingdirectory" id="qafiledialoggetexistingdirectory"></a>

<mark style="color:blue;">Argümanlar</mark>

`caption: str = ''`: Dosya diyalog başlığının başlığı

`directory: str = ''`: Diyalogun başlangıç dizini

<mark style="color:blue;">Döndürür</mark>

`path:str`: Kullanıcı tarafından seçilen yol.

### \`add\_block(My\_Block.op\_code, My\_Block)\` <a href="#add_blockmy_blockop_code-my_block" id="add_blockmy_blockop_code-my_block"></a>

Bu bölüm, Tasarımcı Penceresi tarafından otomatik olarak oluşturulur ve değiştirilmemelidir. Değiştirilmesi gerekiyorsa, blok adının sınıf adı ile ve `op_code` ile aynı olduğundan emin olun.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.augelab.com/turkish/one-cikan-ozellikler/create-plugins-with-designer-window/coding-reference.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
