Przekształcenie trzech skryptów w jeden

0

Cześć mam pytanie, czy ja to zrobiłem dobrze. Używam programu pymol do budowy obiektów molekularnych, korzysta on z cmd, ale mniejsza z tym. Zrobiłem trzy skrypty:
copy - kopiujący cząsteczki
rotate - rotujący cząsteczki o losowy kąt
translate - przesuwający cząsteczki o wektor

każdy po kolei osobno działa i uruchamiam je w takiej kolejności copy- żebym miał odpowiednią ilość cząsteczek, rotate - żebym każda była zrotowana o losowy kąt, translate - żeby każdą kolejną cząsteczkę przesuwać, tak żeby wyszła mi warstwa jak w błonie komórkowej. Oto każdy ckrypt z osobna:
copy.py

from pymol import cmd

def copy_molecule(l):
    s = range(l)
    for x in s:
        cmd.copy("dopc%s" % x, "dopc")

cmd.extend("copy_molecule", copy_molecule);

rotate.py

from pymol import cmd
import random

def rotate_molecule(l):
    s = range(l)
    for x in s:
        angle = random.randint(0, 360)
        cmd.rotate([0, 0, 1], angle, "dopc%s" %x, 0, 1, None, "dopc2")

cmd.extend("rotate_molecule", rotate_molecule);

translate.py

from pymol import cmd


def translate_molecule(q):
#q - odległość częsteczek od siebie

    a = [0, 0, 0]
    liczba = 0
    while a[0] <= 7*q:
        while a[1] < 7*q:
            a[1] += q
            liczba += 1
            cmd.translate(a, "dopc%s" %liczba)
            print(a)
        if a[0] <= 7*q:
            if a[1] == 7*q and a[0] == 7*q:
                break

            a[1] = 0
            a[0] += q
            liczba += 1
            cmd.translate(a, "dopc%s" % liczba)
        print(a)

cmd.extend("translate_molecule", translate_molecule);

Ale jak chciałem to wszystko połączyć w całość to nie wyszło i mam cały czas napisane "Executive-Error: object not found." Tak jakby nie skopiowało tego

Oto skrypt w scalony:

from pymol import cmd
import random

#l - liczba cząsteczek, które chcemy mieć w warstwie, q - odległość pomiędzy cząsteczkami
def layer_build(l, q):
    s = range(l)
    for x in s:
        cmd.copy("dopc%s" % x, "dopc")

    s = range(l)
    for x in s:
        angle = random.randint(0, 360)
        cmd.rotate([0, 0, 1], angle, "dopc%s" % x, 0, 1, None, "dopc%s" % x)

    a = [0, 0, 0]
    liczba = 0
    while a[0] <= 7*q:
        while a[1] < 7*q:
            a[1] += q
            liczba += 1
            cmd.translate(a, "dopc%s" %liczba)
            print(a)
        if a[0] <= 7*q:
            if a[1] == 7*q and a[0] == 7*q:
                break

            a[1] = 0
            a[0] += q
            liczba += 1
            cmd.translate(a, "dopc%s" % liczba)
        print(a)

cmd.extend("layer_build", layer_build);

Aha i pymol obsł↓guje tylko pythona 2 i tak się w nim tworzy skrypty https://pymolwiki.org/index.php/Simple_Scripting

1

Zrefaktorowałeś to do jakiejś jednej większej funkcji i wyszło jak zwykle:) A Spróbuj, tak jak to było, te same metody połączyć w jeden skrypt (Usuniesz tylko duplikaty importów), i Zobaczysz co będzie.

1

Aha i pymol obsł↓guje tylko pythona 2

Lekko nieaktualne są Twe dane - https://pymol.org/2/#download

1 użytkowników online, w tym zalogowanych: 0, gości: 1