Skip to content

Instantly share code, notes, and snippets.

@muschellij2
Created December 13, 2021 17:55
Show Gist options
  • Save muschellij2/d8942954d86a70df21a09dae2a0ce33d to your computer and use it in GitHub Desktop.
Save muschellij2/d8942954d86a70df21a09dae2a0ce33d to your computer and use it in GitHub Desktop.
Scripts for 3D YouTube Video
# rm(list=ls())
convert_index <- function(infile="index_original.html", outfile = "index.html"){
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
ff <- file(infile)
dat <- readLines(ff)
close(ff)
where.scene <- which(dat == " r0 = new X.renderer('r0');")
dat[where.scene] <- " renderer0 = new X.renderer3D();"
dat[where.scene+1] <- " renderer0.container = 'r0';"
dat[where.scene+2] <- " renderer0.init();"
dat <- sub(x=dat, pattern="http://get.goXTK.com/xtk.js", replacement = "http://get.goXTK.com/xtk_edge.js", fixed=TRUE)
dat <- gsub(x=dat, pattern=" r0.", replacement = " renderer0.", fixed=TRUE)
### () denotes what you want to match
dat <- gsub(x=dat, pattern="\\.setColor\\((.*)\\)", replacement = "\\.color = \\[\\1\\]")
dat <- gsub(x=dat, pattern="\\.setUp\\((.*)\\)", replacement = "\\.up = \\[\\1\\]")
dat <- gsub(x=dat, pattern="\\.setPosition\\((.*)\\)", replacement = "\\.position = \\[\\1\\]")
dat <- gsub(x=dat, pattern="\\.setOpacity\\((.*)\\)", replacement = "\\.opacity = \\1")
dat <- gsub(x=dat, pattern="\\.load\\((.*)\\)", replacement = "\\.file = \\1")
dat <- gsub(x=dat, pattern="\\.setVisible\\((.*)\\)", replacement = "\\.visible = \\1")
dat <- gsub(x=dat, pattern="\\.setCaption\\((.*)\\)", replacement = "\\.caption = \\1")
### making models meshes
dat <- gsub(x=dat, pattern="vtkMRMLModelNode(.*) = new X\\.object\\(\\);", replacement = "vtkMRMLModelNode\\1 = new X\\.mesh\\(\\);")
dat <- gsub(x=dat, pattern=".children().push", replacement = ".children.push", fixed=TRUE)
dat <- gsub(x=dat, pattern=".camera()", replacement = ".camera", fixed=TRUE)
# parents <- dat[grepl(x=dat, pattern=".children.push", fixed=TRUE)]
# parents <- unique(trim(gsub(x=parents, pattern=".(.*)\\.children\\.push.*", replacement = "\\1", fixed=FALSE)))
# parents <- parents[parents != "scene"]
# for(iparent in 1:length(parents)){
# dat <- gsub(x=dat, pattern=paste(parents[iparent], ".children.push", sep=""), replacement = "scene.children.push", fixed=TRUE)
# }
#children.push(vtkMRMLModelNode
#outfile <- file.path(moddir, "index.html")
ff <- file(outfile)
writeLines(dat, con=ff)
close(ff)
}
rm(list=ls())
ids <- c( "238-4136", "238-4160")
for (id in ids){
basedir <- "~/Dropbox/Public"
codedir <- file.path(basedir, "Scripts_for_Slicer_Export")
moddir <- file.path(basedir, paste(id, "_Full_Model", sep=""))
## index is already converted
index <- file.path(moddir, "index.html")
ff <- file(index)
dat <- readLines(ff)
close(ff)
index <- file.path(codedir, "Brain_Slice_Code_revised.txt")
ff <- file(index)
code <- readLines(ff)
close(ff)
type <- "checkbox"
getitem <- file.path(codedir, "getItem.txt")
if (type== "checkbox") getitem <- file.path(codedir, "getItem_checkbox.txt")
ff <- file(getitem)
getitem <- readLines(ff)
close(ff)
html.end <- grep(pattern="</body>", x=dat, fixed=TRUE)
java.end <- grep(pattern="renderer0.render();", x=dat, fixed=TRUE)
script.end <- grep(pattern="</script>", x=dat, fixed=TRUE)[2]
dat <- data.frame(cbind(dat=dat, obj_num=cumsum(grepl(x=dat, pattern="new X\\."))), stringsAsFactors=FALSE)
dropper <- function(x) return(x[x != ""])
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
getInfo <- function(x, info) {
# print(x)
if (info == "object"){
x <- x[grep(x=x, pattern="(.*) = new X.*")]
x <- gsub(x=trim(x), pattern="(.*) = new X.*", replacement = "\\1")
} else {
x <- x[grep(x=x, pattern=paste("\\.", info, sep=""))]
x <- trim(gsub(x=x, pattern=paste("vtk.*.", info, " =(.*);", sep=""), replacement = "\\1"))
x <- gsub(x=x, pattern="'", replacement = "")
x <- gsub(x=x, pattern=".vtk", replacement = "", fixed=TRUE)
}
if (length(x) == 0) x <- NA
# print(length(x))
return(x)
}
info <- sapply(c("caption", "file", "object"), function(type) tapply(dat$dat, dat$obj_num, getInfo, info=type))
info <- info[!is.na(info[, "file"]), ]
## making all rois invisible
ROIS <- info[grepl(x=c(info[, "caption"]), pattern="ROI"), "object"]
for (iROI in 1:length(ROIS)) {
dat$dat <- gsub(x=dat$dat, pattern = paste(ROIS[iROI], ".visible = true;", sep=""), replacement = paste(ROIS[iROI], ".visible = false;", sep=""), fixed=TRUE)
# gsub(x=dat, pattern = paste(ROIS[iROI], ".opacity = .*;"), replacement = paste(ROIS[iROI], ".opacity = 0.0;"), fixed=TRUE)
}
ROIS <- paste(paste("'", ROIS, "'", sep=""), collapse= ", ")
addscript <- paste("ROIS = [", ROIS, "];", sep="")
info <- info[order(info[, "caption"]),]
brains <- info[grepl(x=c(info[, "caption"]), pattern="_SS"), "object"]
opac_brain <- c('function opac_brain(sliderID, textbox) {', ' var x = document.getElementById(textbox);', ' var y = document.getElementById(sliderID);',
' var val = y.value;',
' x.value = val;',
' low = Math.floor(val);',
' op_low = (val - low);',
paste(brains[1], '.opacity = op_low;', sep=""),
paste(brains[1], '.visible = true;', sep=""),
'};')
## making all dup brains invisible and making one visible
dat$dat <- gsub(x=dat$dat, pattern = paste(brains[1], ".visible = false;", sep=""), replacement = paste(brains[1], ".visible = true;", sep=""), fixed=TRUE)
if (length(brains) > 1){
for (ibrain in 2:length(brains)) {
dat$dat <- gsub(x=dat$dat, pattern = paste(brains[ibrain], ".visible = true;", sep=""), replacement = paste(brains[ibrain], ".visible = false;", sep=""), fixed=TRUE)
# gsub(x=dat, pattern = paste(ROIS[iROI], ".opacity = .*;"), replacement = paste(ROIS[iROI], ".opacity = 0.0;"), fixed=TRUE)
}
# stop("me")
}
brains <- paste(paste("'", brains, "'", sep=""), collapse= ", ")
if (length(brains) == 1) code <- gsub(x=code, pattern="o = eval(brains[1]);", replacement="o = eval(brains);", fixed=TRUE)
addscript <- c(addscript, paste("brains = [", brains, "];", sep=""))
info <- info[grepl(x=c(info[, "caption"]), pattern="ROI"),]
info <- cbind(info, obj_num = rownames(info))
tmp <- matrix(unlist(info), nrow=nrow(info), ncol=ncol(info))
colnames(tmp) <- colnames(info)
rownames(tmp) <- rownames(info)
info <- tmp
info <- data.frame(info, stringsAsFactors=FALSE)
info <- info[order(info$caption),]
addhtml <- c('<FORM NAME = f1>', '<P align="center">')
if (type== "checkbox") addhtml <- c(addhtml, apply(info, 1, function(x) paste('<Input type = checkbox Name = r1 Value = "', x["object"], '" onClick =GetSelectedItem()>', x["caption"], sep="")), '</P>', '</FORM>')
else addhtml <- c(addhtml, apply(info, 1, function(x) paste('<Input type = radio Name = r1 Value = "', x["object"], '" onClick =GetSelectedItem()>', x["caption"], sep="")), '</P>', '</FORM>')
# addhtml <- c(addhtml, "<div id='ROIS' class=\"anatomyBox\" onClick=\"show('ROIS');\" onMouseover=\"show('ROIS');\">",
# " <span><img",
# " src=\"viewall.png\" style=\"vertical-align: right\"> ROIs</span>",
# " </div>"
# )
addmore <- NULL
# addmore <- c('<fieldset>', '<div id="slider-v1-verticalWrapper" class="verticalWrapper">', '<input maxlength="6" name="slider1" id="slider-v1" type="text" title="Range: -10 to 10" class="" value="0" />', '</div>', '<script type="text/javascript" src="slider.js"></script>', '<script type="text/javascript">', '//<![CDATA[',
# '/*******************************************************************************',
# ' Create the slider using JS',
# ' ******************************************************************************/',
# '// Remove the onload event as we are creating the sliders with a JS call',
# 'fdSliderController.removeOnLoadEvent();',
# '// Create an Object to hold the sliders initialisation data',
# 'var options = {',
# ' // A reference to the input',
# ' inp: document.getElementById("slider-v1"),',
# ' // A String containing the increment value (and the return precision, in this case 2 decimal places "x.20")',
# ' inc: "0.10",',
# ' // Maximum keyboard increment (automatically uses double the normal increment if not given)',
# ' maxInc: "1",',
# ' // Numeric range',
# paste(' range: [1,', nrow(info), '],',sep=""),
# ' // Callback functions',
# ' callbacks: { "update":[myObject.callback], "create":[setUpVerticalSliderOutput, myObject.callback] },',
# ' // String representing the classNames to give the created slider',
# ' classNames: "verticalclass",',
# ' // Tween the handle onclick?',
# ' tween: true,',
# ' // Is this a vertical slider',
# ' vertical: true,',
# ' // Do we hide the associated input on slider creation',
# ' hideInput: true,',
# ' // Does the handle jump to the nearest click value point when the bar is clicked (tween cannot then be true)',
# ' clickJump: true,',
# ' // Full ARIA required',
# ' fullARIA: false,',
# ' // Do we disable the mouseWheel for this slider',
# ' noMouseWheel: false',
# '};',
# '// Create the slider',
# 'fdSliderController.createSlider(options);',
# '//]]>',
# '</script></fieldset>')
#printValue('slider2','rangeValue2');
top <- nrow(info)-1
step <- top/ 100
addmore <- c(addmore, paste('<input id="slider2" type="range" min="0" max="', top, '" step="', step, "\" value=\"0\" onchange=\" show2('slider2','rangeValue2');\"/>", sep=""), '<input id="rangeValue2" type="text" size="10"/>')
addmore <- c(addmore, paste('<input id="slider_brain" type="range" min="0.01" max="0.99" step="', 0.01, "\" value=\"0.50\" onchange=\"opac_brain('slider_brain','range_brain');\"/>", sep=""), '<input id="range_brain" type="text" size="10"/>')
# addmore <- c(addmore, "<script type=\"text/javascript\"> show2('slider2','rangeValue2') </script>")
dat <- dat$dat
dat <- c(dat[1:java.end], dat[(java.end+1):(script.end-1)], addscript, getitem, code, opac_brain, dat[script.end], dat[(script.end+1):(html.end-1)], addhtml, addmore, dat[html.end:length(dat)])
outfile <- file.path(moddir, "index_jsed.html")
ff <- file(outfile)
writeLines(dat, con=ff)
close(ff)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment