Python ve Node.js’de “simetrik” eklentiler, sınıflar ve kategoriler API’si. #
Uyarı: Bu, türlerin, yöntemlerinin, özelliklerinin vb. tam bir açıklaması değildir. Burada yalnızca genel kavramlar açıklanmıştır. Somut türlerin ve yöntemlerinin tam açıklaması için API Referans Kılavuzlarına bakın.
Python #
Konteyner nesneleri #
Şimdi bir VRayRenderer örneği oluşturalım :
import vray<br />
renderer = vray.VRayRenderer()
Daha sonra
`renderer.plugins`, bu renderer içindeki tüm eklenti örneklerinin bulunduğu bir kapsayıcıdır.
`renderer.classes`, bu oluşturucuya yüklenen ve dolayısıyla bu oluşturucu tarafından desteklenen tüm eklenti sınıflarının (veya türlerinin) bir kapsayıcısıdır.
`renderer.categories`, eklentilerin ait olabileceği tüm eklenti kategorilerini içeren bir kapsayıcıdır. Bu kapsayıcı diğer ikisi kadar önemli olmasa da bazı durumlarda oldukça faydalı olabilir.
`renderer.plugins` , `renderer.classes` ve `renderer.categories` , sözlük benzeri bazı özelliklere sahip özel nesnelerdir ancak sözlük değillerdir:
-
Bunlar eşleme protokolünü (sözlükler gibi) destekler – eklentilerdeki anahtarlar eklenti adlarıdır , sınıflardaki anahtarlar sınıf adlarıdır ve kategorilerdeki anahtarlar kategori adlarıdır , örneğin renderer.plugins[‘settingsColorMapping’] , renderer.classes[‘SettingsColorMapping’] , renderer.categories [ ‘ Settings’] .
-
Bunlar yinelenebilir yapıdadır , ancak yineleme, içerdikleri eklenti / sınıf / kategori nesneleri üzerinde (kümeler gibi) gerçekleştirilir , adları üzerinde (sözlükler gibi) değil .
-
Bunlar, öznitelik adına göre erişimi destekler; örneğin, `renderer.plugins.settingsColorMapping` , `renderer.plugins[‘settingsColorMapping’]` ile aynı nesneyi döndürür , `renderer.classes.SettingsColorMapping`, `renderer.classes[‘SettingsColorMapping’]` ile aynı nesneyi döndürür ve `renderer.categories.Settings`, `renderer.categories[‘Settings’]` ile aynı nesneyi döndürür .
-
`len()` fonksiyonu , içerdikleri eklenti / sınıf / kategori nesnelerinin sayısını döndürür .
Bu 3 kapsayıcı ( eklentiler , sınıflar ve kategoriler ) arasında yalnızca eklentiler silme (öğeleri kaldırma) işlemini destekler . Yineleme sırasında eklenti örneklerinin silinmesi ve oluşturulmasının desteklendiğini belirtmek önemlidir :
for plugin in renderer.plugins: # This is preferred<br />
if someCondition:<br />
# Delete the plugin in plugins. Its reference then becomes invalid and 'plugin' is removed from renderer.plugins<br />
plugin.deleteThis() # plugin.isValid() will return False after this call<br />
# Alternative way to delete plugin instances<br />
# del renderer.plugins[plugin] # use the plugin name or the plugin instance as the key<br />
if otherCondition:<br />
# Create a new plugin (with an auto-generated name) inside renderer.plugins<br />
renderer.classes.Node()
Şununla tamamen aynı şekilde çalışır:
</p>
<div class="cm-activeLine cm-line"><span class="ͼb">for</span> plugin <span class="ͼb">in</span> list(renderer.plugins): <span class="ͼm"># This is redundant and slower</span></div>
<div class="cm-line"> ...</div>
<p data-v-97f42bc7="" data-v-9f7b400c="">
veya
for plugin in vray.PluginList(source = renderer.plugins): # This is redundant and slower<br />
...
Ancak bu daha verimli olurdu. Yeni oluşturulan eklenti örnekleri döngüye dahil edilmezken, silinen eklentiler geçersiz referanslar olarak dahil edilirdi (bkz. plugin.isValid() yöntemi).
Konteyner nesneleri ayrıca yöntemler de içerebilir, örneğin
renderer.categories.getInstances((renderer.categories.GeometricObject, renderer.categories.Light))
Bu, ışık olan tüm geometrik nesneleri (veya bakış açınıza bağlı olarak, aynı zamanda geometrik nesne olan tüm ışıkları) döndürür; ancak sonuç tamamen aynıdır.
Eklenti nesneleri, sınıf nesneleri ve kategori nesneleri #
Bu üçü de benzer özellikler paylaşıyor (ancak kategori nesneleri yukarıda açıklanan kapsayıcı nesnelere daha yakındır, açıklamalarına aşağıda bakabilirsiniz).
Eklenti nesneleri #
Eklenti nesneleri, bir VRayRenderer örneği içindeki eklenti örneklerine referanslardır (veya tanıtıcılardır). Eklenti parametreleri , eklenti nesnelerinde hem öznitelikler hem de anahtarlar olarak sunulur. Bunlar her zaman değer olarak okunur ve yazılır; yani onları okuduğunuzda , içerdikleri tüm değerin bir kopyasını alırsınız (liste gibi karmaşık bir değer olsa bile) ve onlara yazdığınızda, değerlerinin bir kopyasını ilgili eklenti parametresine yerleştirirsiniz.
Eklenti nesneleri, hem eklenti parametrelerini ( nitelikleri , anahtarları veya getter / setter yöntemleri aracılığıyla) değiştirmek için kullanılan eklenti tanıtıcıları hem de diğer eklenti parametrelerine değer olarak ayarlanabilen eklenti referansları olarak işlev görür.
Eklenti nesneleri, sözlük benzeri özel tiplerdir . Bir eklenti nesnesi üzerinde yineleme, sözlüklerde olduğu gibi parametre adları üzerinde yineleme yapar . Bu davranışın, yinelemenin anahtarlar yerine içerdikleri değerler (yani eklenti , sınıf veya kategori nesneleri) üzerinde gerçekleştirildiği renderer.plugins , renderer.classes ve renderer.categories kapsayıcılarının davranışından farklı olduğunu unutmayın.
Bir eklenti nesnesi , anahtarlar ve niteliklerin yanı sıra, temel alınan eklenti örneği üzerinde çeşitli işlemler gerçekleştirmek veya onun hakkında bazı bilgileri sorgulamak için yöntemlere de sahiptir.
Eklenti nesneleri, temel eklenti örneği silindiğinde geçersiz hale gelebilir (veya silinme anında geçersiz olabilir) .
PluginRef nesneleri #
PluginRef türü , Plugin sınıfının bir uzantısıdır . Amacı, alternatif eklenti çıktılarına referans vermektir . Bazı eklentiler (örneğin dokular), diğer eklentilere girdi olarak kullanıldığında belirli bir türde (örneğin AColor ) veri üretir, ancak diğer türlerde (örneğin float , int , vb.) ek çıktılara ( çıktı parametreleri olarak adlandırılır ve .vrscene dosyalarında pluginName::outputParamName ile belirtilir) sahip olabilirler . Bir PluginRef nesnesi, bir eklenti nesnesinden ve o eklentinin alternatif bir çıktı parametresinden oluşur . PluginRef’ler , altta yatan eklentinin parametrelerini değiştirmek için kullanılabilse de, asıl amaçları diğer eklenti girdi parametrelerinin değerleri olarak kullanılmaktır .
Unutmayın ki, bir eklenti ve bir pluginRef nesnesi bir VRayRenderer içindeki aynı eklenti örneğine referans verse bile, plugin == pluginRef karşılaştırması False olacaktır . (Ancak plugin == pluginRef.getPlugin() ve plugin.getPlugin() == pluginRef.getPlugin() karşılaştırmaları True olacaktır .)
Sınıf nesneleri #
Sınıf nesneleri eklenti türlerini temsil eder. Çoğunlukla eklenti örnekleri oluşturmak ve eklenti örneği oluşturmadan eklenti ve/veya parametreleri hakkında bazı bilgileri sorgulamak için kullanılırlar.
</p>
<div># Create a plugin of type Node with the name 'myNode1' and assign a reference to it to variable node</div>
<div>node = renderer.classes.Node('myNode1')</div>
<div></div>
<div># Create a plugin of type Node with the name 'myNode2'</div>
<div>renderer.classes.Node('myNode2')</div>
<div></div>
<div># In both cases the new plugin becomes available in renderer.plugins</div>
<div>node1 = renderer.plugins.myNode1</div>
<div>node2 = renderer.plugins.myNode2</div>
<div></div>
<div># Comparisons</div>
<div>node == node1 # Compare plugin instances. This would be True</div>
<div>node == node2 # Compare plugin instances. This would be False</div>
<div>node.getClass() == node2.getClass() # Compare plugin classes. This would be True</div>
<div>node.getClass() == renderer.classes.Node # Compare plugin classes. This would be True</div>
<p data-v-97f42bc7="" data-v-9f7b400c="">
Sınıf nesneleri, temsil ettikleri eklenti türünün parametre adları üzerinde yinelenebilir (eklenti nesnelerine benzer şekilde). Şu anda, parametre adlarını kullanarak sınıf özniteliklerine veya anahtarlarına erişmek, class.getMeta(paramName) yöntemini çağırmakla aynı veriyi döndürür. Ancak bu davranışa güvenmemeli ve her zaman getMeta() yöntemini açıkça çağırmalısınız çünkü davranış gelecekte değişebilir.
Sınıf nesneleri ayrıca kendi türlerindeki eklenti nesnelerini oluşturmak veya almak ya da bunlar veya parametreleri hakkında bazı bilgileri sorgulamak için yöntemlere de sahiptir.
Kategori nesneleri #
Kategori nesneleri, benzer özelliklere sahip benzer eklenti türlerini gruplandırır. Bunlar renderer.categories içerisinde yer alır . Bir eklenti (örnek veya sınıf) hiçbirine, bir veya birden fazla eklenti kategorisine ait olabilir.
Kategori nesneleri, kendilerine ait eklenti sınıflarını gruplandırdıkları için renderer.classes kapsayıcısına daha çok benzerler .
Kategori nesneleri:
-
Eşleme protokolünü (sözlükler gibi) destekleyin – anahtarları sınıf adlarıdır , örneğin renderer.categories.GeometricObject[‘Node’] .
-
Yineleme yapılabilir ancak yineleme, sınıf adları üzerinde değil (sözlükler gibi ) içerdikleri sınıf nesneleri üzerinde (kümeler gibi) gerçekleştirilir .
-
Öznitelik adına göre erişimi destekleyin, örneğin `renderer.categories.GeometricObject.Node` , `renderer.categories.GeometricObject[‘Node’]` ile aynı nesneyi döndürür .
-
Dizinlenebilirler , bu da sıralı protokolü desteklemeye benzer. len(category) o kategoriye ait sınıf sayısını döndürür.
-
Bunlara ait eklenti nesnelerini döndüren yöntemlere ( category.getInstances() ) veya bir eklenti örneğinin veya bir sınıfın bunlara ait olup olmadığını kontrol eden yöntemlere ( category.belongs(object) ) sahip olun.
Node.js #
Konteyner nesneleri #
Şimdi bir VRayRenderer örneği oluşturalım :
const vray = require('./node/vray');<br />
let renderer = new vray.VRayRenderer;Daha sonra
`renderer.plugins`, bu renderer içindeki tüm eklenti örneklerinin bulunduğu bir kapsayıcıdır.
`renderer.classes`, bu oluşturucuya yüklenen ve dolayısıyla bu oluşturucu tarafından desteklenen tüm eklenti sınıflarının (veya türlerinin) bir kapsayıcısıdır.
`renderer.categories`, eklentilerin ait olabileceği tüm eklenti kategorilerini içeren bir kapsayıcıdır. Bu kapsayıcı diğer ikisi kadar önemli olmasa da bazı durumlarda oldukça faydalı olabilir.
renderer.plugins , renderer.classes ve renderer.categories özel nesnelerdir:
-
Bunların özellikleri , içerdikleri eklenti / sınıf / kategori nesneleridir.
-
Bunlar numaralandırılabilir ve anahtarlar (örneğin eklenti / sınıf / kategori adları ) aracılığıyla döngüler içinde desteklenir.
-
Bunlar yinelenebilir ve değerlere göre döngüleri destekler (yani içerdikleri eklenti / sınıf / kategori nesneleri ).
-
Bunlar, özellik adına göre erişimi destekler; örneğin renderer.plugins.settingsColorMapping veya renderer.plugins[‘settingsColorMapping’] , renderer.classes.SettingsColorMapping veya renderer.classes[‘SettingsColorMapping’] ve renderer.categories.Settings veya renderer.categories[‘Settings’] .
-
Bu nesnelerin .length özelliği , içerdikleri eklenti / sınıf / kategori nesnelerinin sayısını döndürür .
-
Listede yer almayan yöntemlere de sahip olabilirler .
Bu 3 kapsayıcı ( eklentiler , sınıflar ve kategoriler ) arasında yalnızca eklentiler silme (öğeleri kaldırma) işlemini destekler . Yineleme sırasında eklenti örneklerinin silinmesi ve oluşturulmasının desteklendiğini belirtmek önemlidir :
for (let plugin of renderer.plugins) { // This is preferred<br />
if (someCondition {<br />
// Delete the plugin in plugins. Its reference then becomes invalid and 'plugin' is removed from renderer.plugins<br />
plugin.deleteThis(); // plugin.isValid() will return false after this call<br />
// Alternative way to delete plugin instances<br />
// delete renderer.plugins[plugin]; // use the plugin name or the plugin instance as the key<br />
}<br />
if (otherCondition) {<br />
// Create a new plugin (with an auto-generated name) inside renderer.plugins<br />
renderer.classes.Node();<br />
}<br />
}
Örneğin şu şekilde tamamen aynı şekilde çalışır:
for (let plugin of Array.from(renderer.plugins)) // This is redundant and slower<br />
...
Ancak bu daha verimli olurdu. Yeni oluşturulan eklenti örnekleri döngüye dahil edilmezken, silinen eklentiler geçersiz referanslar olarak dahil edilirdi (bkz. plugin.isValid() yöntemi).
Konteyner nesneleri ayrıca yöntemler de içerebilir, örneğin
renderer.categories.getInstances([renderer.categories.GeometricObject, renderer.categories.Light]);
Bu, ışık olan tüm geometrik nesneleri (veya bakış açınıza bağlı olarak, aynı zamanda geometrik nesne olan tüm ışıkları) döndürür; ancak sonuç tamamen aynıdır.
Eklenti nesneleri, sınıf nesneleri ve kategori nesneleri #
Bu üçü de benzer özellikler paylaşıyor (ancak kategori nesneleri yukarıda açıklanan kapsayıcı nesnelere daha yakındır, açıklamalarına aşağıda bakabilirsiniz).
Eklenti nesneleri #
Eklenti nesneleri, bir VRayRenderer örneği içindeki eklenti örneklerine referanslardır (veya tanıtıcılardır). Eklenti parametreleri , eklenti nesnelerinin özellikleri olarak sunulur. Bunlar her zaman değer olarak okunur ve yazılır; yani onları okuduğunuzda , içerdikleri tüm değerin bir kopyasını alırsınız (liste gibi karmaşık bir değer olsa bile) ve onlara yazdığınızda, değerlerinin bir kopyasını ilgili eklenti parametresine yerleştirirsiniz (bir istisna vardır, aşağıdaki nota bakın).
Eklenti nesneleri, hem eklenti parametrelerini ( özellikleri veya getter / setter yöntemleri aracılığıyla) değiştirmek için kullanılan eklenti tanıtıcıları hem de diğer eklenti parametrelerine değer olarak ayarlanabilen eklenti referansları olarak işlev görür.
Eklenti nesneleri, numaralandırılabilir özel tiplerdir. ` for…in` döngüsü, bir eklenti nesnesi üzerinde parametre adlarını yineleyerek çalışır . `for…of` döngüleri desteklenmez .
Bir eklenti nesnesi, temel alınan eklenti örneği üzerinde çeşitli işlemler gerçekleştirmek veya onun hakkında bazı bilgileri sorgulamak için yöntemlere de sahiptir. Bunlar for…in döngülerine dahil edilmez .
Eklenti nesneleri == operatörü ile karşılaştırılabilir. Sınıf nesneleri bölümündeki aşağıdaki örneğe bakın.
Eklenti nesneleri, temel eklenti örneği silindiğinde geçersiz hale gelebilir (veya silinme anında geçersiz olabilir) .
Büyük tipli listelerle ilgili not : `renderer.maxTypedListsCopyByteSize`
özelliği, V-Ray tipli listelerinin (şu anda `IntList` , `FloatList` , `ColorList` ve `VectorList` ) içeriğinin ilgili eklenti parametresine kopyalanıp kopyalanmayacağını kontrol eder. Varsayılan değer -1’dir , bu da her zaman tüm verilerin kopyalanması anlamına gelir. Bunu 0 veya pozitif bir sayıya ayarlarsanız , bayt cinsinden boyutu ayarlanan sayıdan büyükse içerik verileri kopyalanmaz. Bunun yerine, doğrudan V-Ray belleğine yerleştirilir ve altta yatan `ArrayBuffer`, V-Ray ve programınız arasında paylaşılır.
PluginRef nesneleri #
PluginRef türü , Plugin sınıfının bir uzantısıdır . Amacı, alternatif eklenti çıktılarına referans vermektir . Bazı eklentiler (örneğin dokular), diğer eklentilere girdi olarak kullanıldığında belirli bir türde (örneğin AColor ) veri üretir, ancak diğer türlerde (örneğin float , int , vb.) ek çıktılara ( çıktı parametreleri olarak adlandırılır ve .vrscene dosyalarında pluginName::outputParamName ile belirtilir) sahip olabilirler . Bir PluginRef nesnesi, bir eklenti nesnesinden ve o eklentinin alternatif bir çıktı parametresinden oluşur . PluginRef’ler , altta yatan eklentinin parametrelerini değiştirmek için kullanılabilse de, asıl amaçları diğer eklenti girdi parametrelerinin değerleri olarak kullanılmaktır .
PluginRef nesneleri de == operatörüyle karşılaştırılabilir. Bir eklenti ve bir pluginRef nesnesi VRayRenderer içindeki aynı eklenti örneğine referans verse bile, plugin == pluginRef karşılaştırmasının yanlış olacağını unutmayın . (Ancak plugin == pluginRef.getPlugin() ve plugin.getPlugin() == pluginRef.getPlugin() karşılaştırmaları doğru olacaktır .)
Sınıf nesneleri #
Sınıf nesneleri eklenti türlerini temsil eder. Çoğunlukla eklenti örnekleri oluşturmak ve eklenti örneği oluşturmadan eklenti ve/veya parametreleri hakkında bazı bilgileri sorgulamak için kullanılırlar.
</p>
<div>// Create a plugin of type Node with the name 'myNode1' and assign a reference to it to variable node</div>
<div>var node = renderer.classes.Node('myNode1')</div>
<div></div>
<div>// Create a plugin of type Node with the name 'myNode2'</div>
<div>renderer.classes.Node('myNode2')</div>
<div></div>
<div>// In both cases the new plugin becomes available in renderer.plugins</div>
<div>var node1 = renderer.plugins.myNode1</div>
<div>var node2 = renderer.plugins.myNode2</div>
<div></div>
<div>// Comparisons</div>
<div>node == node1 // Compare plugin instances. This would be true</div>
<div>node == node2 // Compare plugin instances. This would be false</div>
<div>node.getClass() == node2.getClass() // Compare plugin classes. This would be true</div>
<div>node.getClass() == renderer.classes.Node // Compare plugin classes. This would be true</div>
<p data-v-97f42bc7="" data-v-9f7b400c="">
Sınıf nesneleri , numaralandırılabilir özel tiplerdir. ` for…in` döngüsü, bir sınıf nesnesi üzerinde yineleme yaparak , temsil ettikleri eklenti türünün parametre adlarını inceler .
Sınıf nesneleri ayrıca, temsil ettikleri eklenti türünün eklenti nesnelerini oluşturmak veya almak, ilgili eklenti türü ve parametreleri hakkında bazı bilgileri sorgulamak için yöntemlere de sahiptir. Bunlar for…in döngülerine dahil edilmez .
Sınıf nesneleri == operatörü ile karşılaştırılabilir. Yukarıdaki örneğe bakın.
Şu anda, parametre adlarını kullanarak sınıf özelliklerine erişmek , class.getMeta(paramName) yöntemini çağırmakla aynı veriyi döndürüyor . Ancak bu davranışa güvenmemeli ve her zaman getMeta() yöntemini açıkça çağırmalısınız çünkü davranış gelecekte değişebilir.
Kategori nesneleri #
Kategori nesneleri, benzer özelliklere sahip benzer eklenti türlerini gruplandırır. Bunlar renderer.categories içerisinde yer alır . Bir eklenti (örnek veya sınıf) hiçbirine, bir veya birden fazla eklenti kategorisine ait olabilir.
Kategori nesneleri, kendilerine ait eklenti sınıflarını gruplandırdıkları için renderer.classes kapsayıcısına daha çok benzerler .
Kategori nesneleri:
-
Özellikler , onlara ait olan eklenti sınıflarıdır .
-
Sınıf adlarına göre döngülerde numaralandırılabilir ve desteklenirler .
-
İçerdikleri sınıf nesneleri üzerinde yinelenebilir ve döngüleri desteklerler .
-
Hem özellik adına (örneğin renderer.categories.GeometricObject.Node ) hem de dizine (örneğin renderer.categories.GeometricObject[0], diziler gibi) göre erişimi destekleyin.
-
Bu nesnelerin .length özelliği , içerdikleri sınıf nesnelerinin sayısını döndürür .
-
Bunlara ait eklenti nesnelerini döndüren yöntemlere ( category.getInstances() ) veya bir eklenti örneğinin veya bir sınıfın bunlara ait olup olmadığını kontrol eden yöntemlere ( category.belongs(object) ) sahip olun.
-
== operatörüyle karşılaştırılabilir .
