Render.ru

Нужно написать скрипт, который строит 3D модель по алгоритму.

Александр Кушелев 1

Пользователь сайта
Рейтинг
2
#1
По варианту входного кода нужно повернуть очередной элемент на соответствующий угол и присоединить к предыдущей конструкции.

Упрощённый вариант скрипта уже написан:

(
dataFiles_arry = #()
dataRaw = #()
kk=#()
pro=#()

rootFolder = getFilenamePath (getSourceFileName()) -- определение корневой папки данных по положению .ms файла

if rootFolder != undefined then dataFiles_arry = getFiles (rootFolder+"\\Composite9\\*.txt") --определения файла .txt в папке Composite9
if dataFiles_arry.count == 1 then --если .txt в папке 1 то
(
dataRaw = (dotnetclass "System.IO.File").ReadAllLines(dataFiles_arry[1]) -- чтение данных из первого найденного .txt в массив из строк
str_arry = #()
for d = 1 to dataRaw.count do
(
join str_arry (filterString dataRaw[d] ",") -- создание массива из строк, где "," разделитель между элементами массива
)
for j = 1 to str_arry.count do -- цикл для всех элементов прочитанного из .txt массива
(
kkVal = str_arry[j] as integer -- конвертация из строчного значение в целое число
proVal = 0

if kkVal == 95 then (kkVal = 5; proVal=1)
if kkVal == 97 then (kkVal = 7; proVal=1)
if kkVal == 98 then (kkVal = 8; proVal=1)

append kk kkVal -- присоединение значения к массиву kk
append pro proVal
)
)
--format "kk->%\n" kk
--format "pro->%\n" pro

newmat = multimaterial name:"MyMultiMat" numsubs: (999)
newmat[1].faceted = on
newmat[2].faceted = on
newmat[3].faceted = on
newmat[4].faceted = on
newmat[5].faceted = on
newmat[6].faceted = on
newmat[7].faceted = on
newmat[8].faceted = on
newmat[9].faceted = on
newmat[1].diffuse = (color 255 0 0)
newmat[2].diffuse = (color 0 255 0)
newmat[3].diffuse = (color 0 0 255)
newmat[4].diffuse = (color 180 100 0)
newmat[5].diffuse = (color 255 0 0)
newmat[6].diffuse = (color 255 0 255)
newmat[7].diffuse = (color 0 0 255)
newmat[8].diffuse = (color 0 255 0)
newmat[9].diffuse = (color 255 255 0)
angx=#(-10,0,0,-10,-10,-1,0,0,-10); angy=#(30,120,30,30,30,50,30,120,30); angz=#(-97,-120,60,-80,-97,-97,60,-120,-97)
dx=#(-1.5,-1,-1.6,-1.5,-1.5,-1.5,-1.6,-1,-1.5); dy=#(0,-0.5,-0.3,0,0,0,-0.3,-0.5,0); dz=#(-1.2,1,1.2,-1.2,-1.2,-1.2,1.2,1,-1.2)
--
angp=#()
angp[14]=0
angp[15]=0
angp[24]=0
angp[25]=0
angp[29]=0
angp[33]=0
angp[34]=0
angp[35]=0
angp[64]=0
angp[74]=0
angp[91]=0
angp[109]=0
angp[110]=0
angp[152]=0
angp[244]=0
angp[275]=0
angp[322]=0
angp[337]=0
angp[361]=0
angp[457]=0
angp[463]=0
angp[502]=0
angp[609]=0
angp[613]=0
angp[614]=0
angp[624]=0
angp[764]=0
angp[795]=0
angp[810]=0
angp[824]=0
angp[836]=0
peptide=box length:0.1 width:0.1 height:0.1 position:[0,0,-.5] wirecolor:[250,250,250]; Converttomesh peptide
peptide.material = newmat[1]

for k = 1 to kk.count-1 do
(
newmat[k].faceted = on
element = sphere radius:0.7 pos:[0,0,0]; Converttomesh element
element.material = newmat[kk[k]]
attach peptide element; peptide.pivot = [0,0,0]; move peptide [dx[kk[k]],dy[kk[k]],dz[kk[k]]]
rotate peptide angx[kk[k]] [1,0,0]; rotate peptide angy[kk[k]] [0,1,0]; rotate peptide angz[kk[k]] [0,0,1]
)
)

Результат его работы с конкретными входными данными:



Однако нужно доработать этот вариант или написать новый.

Упрощённый вариант строит модель из одинаковых элементов, а нужно из таких же, но с дополнениями. Дополнения (их 23, это радикалы аминокислот) в скрипте Дениса Савина есть, но сам скрипт сложный, поэтому написать новый, простой скрипт может оказаться проще, чем модифицировать сложный скрипт Дениса Савина. Подробности обсуждаются на форуме лаборатории Наномир: http://nanoworld.org.ru/topic/2219/

Работа может быть оплачена инвестором по стандартным расценкам. Короче, если Ваша цена устроит инвестора, то работаем.
 
Рейтинг
327
#3
здесь есть Igorznaq
с ним пообщайся. Он здесь самый крутой кодер
еще на 3d center обитает джаман, тоже кодит
 

LastJedi

Знаток
Рейтинг
27
#8
А сформулированное ТЗ есть? Что на входе, что нужно получить?
На первый взгляд, задача не сложная…
 

Александр Кушелев 1

Пользователь сайта
Рейтинг
2
#9
А сформулированное ТЗ есть? Что на входе, что нужно получить?
На первый взгляд, задача не сложная…
На входе два файла в текстовом формате. Один - кодирующая нуклеотидная последовательность типа такой:

>VOAJ01024667.1:c2335584-2334658 Crocuta crocuta isolate KB4526 scaffold179, whole genome shotgun sequence
CCCAGGCCCAGCGCTGGCCCCGCTCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCC
CCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCAC
TCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCAC
TCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTC
ATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCC
TGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGC
CCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCC
CCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCC
CGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCC
CCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCA
CTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCA
CTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCT
CATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATCCTGGCCCCCCCCCCGCCCCCACTCACTCTCATC
CTGGCCCCNAGCCTGCG

Каждые три буквы этого файла обозначают аминокислоту, которая должна находиться в библиотеке внутри будущего скрипта. Такая библиотека уже есть в скрипте Дениса Савина.

Этот же входной файл обрабатывает отлаженная программа "Пикотех 2D" и сохраняет второй файл, который нужен для работы нашего скрипта. Он имеет такой вид:

1,1,1,1,7,5,95,7,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,
97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,
9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,
1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,
7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,
1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,5,7,7,97,1,1,1,1,1,9,7,
5,7,7,97,5,95,0,97,4,

Каждое число означает, на какой угол из таблицы нужно повернуть очередную аминокислоту перед тем, как присоединить к будущей модели белка.

Программа Пикотех 2D изображает эти варианты в виде цветной схемы:


Вариант 1 обозначен красным цветом. Это - альфа-спираль.

Наш скрипт должен построить 3D модель этой спирали и отработать остальные коды, разделенные запятыми.

Более подробно ТЗ сформулировано здесь: http://nanoworld.org.ru/topic/2219/

Тут надо определиться, имеет ли смысл модифицировать скрипт Дениса Савина, свежую версию которого я могу прислать Вам по почте. Она весит 150 килобайт. Или имеет смысл написать отдельный 3D модуль, который будет обрабатывать два входных файла, брать из собственной библиотеки модели аминокислот и соединять их в модель белка типа такой:



На самом деле визуализация не обязательна. Главное рассчитать координаты атомов и сохранить их в стандарте PDB, т.е. примерно в таком виде:



Это значит, что программу можно написать на любом языке программирования.

Визуализировать координаты может стандартный браузер белковых структур, например, Swiss Wiever:


Задачу можно решать по этапам. Сначала, например, перенести библиотеку аминокислот из скрипта Дениса Савина в наш скрипт. Потом написать его до уровня расчета координат. А потом уже доделать вывод PDB-файла. И соответственно оплата поэтапная.

Может быть имеет смысл обсудить ТЗ на форуме или в чате. В диалоге всё прояснится быстро :)

С уважением,
 

LastJedi

Знаток
Рейтинг
27
#10
Стало немного понятней, но пока объём работ всё ещё не совсем ясен.

Если визуализация в 3ds Max не очень нужна, то выбор MAXScript для решения задачи кажется не лучшим решением, хотя и возможным. Просто, фактически, создание геометрии в 3ds Max никак не поможет решению основной задачи — формированию PDB-файла. При этом написание и отладка этой части скрипта, составит существенную часть всей работы…

Надо бы посмотреть, что собой представляет "библиотека аминокислот", и как данные из неё влияют на решение.

На данный момент мне кажется, что логичней решать данную задачу в виде самостоятельного приложения, например на C#, ну или в виде скрипта Python, не привязываясь к 3ds Max.

Можем пообщаться подробнее. Моя почта: LastJedi@ya.ru или Телеграм: @p_ky3
 
Сверху