text:
Clock with single hour hand to show current local time on running script?
It's a clock with only one single hour hand. 360 radians turns the selected handle the whole circle, but how to script it to read local time and calculate the degrees and assign it to the handle? I know there are quite a few steps to get there, but maybe some advice where to start?
import bpy
import os
import math

bpy.context.active_object.rotation_euler[2] = math.radians(0)

Q: Is it possible with bpy?

Have you imported datetime module and either print the time string or look for hours minutes seconds properties?  I often print the time to the console. import datetime
print(datetime.datetime.now())

How much experience do you have with Python or Blender Drivers?

To be honest, nearly none at all :/  I know syntax a bit at the moment, but however I am studying bpy intensely now. I want to find out the direction where to go next in automating the whole process. You helped me a lot. Thank you very much.

Robert please be honest.  (Unless you would like to be President of the United States (of North America)) Please see driver info on noonoob.  Hopefully a 5 minute video will be enough for today. Please see edited answer

Loosely related. https://blender.stackexchange.com/questions/38373/how-to-copy-animation-attributes-to-multiple-objects/38378#38378

https://docs.python.org/3/library/datetime.html#datetime.time.second

I cannot thank you enough! I will show my improvements after I am done.

Rotation by Driver
Some small sample to look at some of the numbers and a simple Driver
import datetime
import bpy
n = datetime.datetime.now()
print(n, n.hour, n.minute, n.second)
#allow this new rename of an existing function to be seen in Blender Drivers

bpy.app.driver_namespace["mytime"] = datetime.datetime.now

#in the driver called as mytime().hour (minute second)
#mytime().second * 2 * pi/60 the formula in the driver please improve
#your correct formula would use hours and minutes

In the text window we inform the driver namespace of a function that we can reference in the  driver.  This script needs to be run once.  You can investigate further enhancements.
In the image you see a driver that refers to that same function. Please click on the image to see it larger. You can see the driver options by context clicking on the rotation value. Please improve the formula. The driver is on the rotation and is seen as the purple color.  The driver window indicates this at the top.  Please excuse my second rate registration.  You see the formula which refers to the same function reference we created in the script. The function will only update when you move the frame position.  The animation is to get you started with some discovery on your own.  Perhaps you can show your improvements.
If you do not know the basics of using a driver then there are examples here at Blender Stack Exchange BSE and the website that has a name that rhymes with noonoob. What is written in this proposed answer is not a tutorial.

Thank you very much. That's a good start!


text:
How to play multiple tracks in video sequencer?
I am a beginner, so it seems to be a simple question. I have 2 tracks in video sequencer. I have added transformation to each of them so that they do not overlap. When I play animation, I see only one track, other is hidden by chess field. How to show both of tracks? (Blender 2.82a)

maybe attach some screenshot?

Done: set Blend option to Alpha Over.

source: Stack Exchange

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

sort: votes


text:
How to Make Earth in Blender tutorial - How to implement the cloud shader properly?
Im following blender gurus How to Make Earth in Blender (Cycles) tutorial, and around the 16 minute mark, when he adds the clouds, mine still end up being opaque. I have followed his exact node setup, but i still dont know where the problem is. I am new to blender, this is my first time making something on this scale

Even though you are using Cycles, you are viewing it in Material Preview mode which uses EEVEE to display your scene (materials in eevee have transparent blend mode set to opaque by default). Press Z in the viewport and select "rendered" from the pie menu.

Have you tried what @ChristotherBennet said?
You need to be in Cycles' Rendered mode to see the transparency as EEVEE doesn't display transparency by default. If you want to see transparency in EEVEE for a material, you need to go to the material's tab under the Settings section and Change the Blend Mode to either Alpha Clip, Alpha Hashed or Alpha Blend :

Also, as @Sabnaldo's answer states, you need to be aware of the orders of your input sockets : if you plug the transparent shader into the bottom socket, it means that all the white parts of your texture is going to be transparent and only the black parts are going to show up, which may not be what you want.
The comment of @Nxdhin2005 should be noted too, if your cloud texture has an alpha chanel, you need to plug it into Fac instead of the color.

It is the material preview using Eevee which Christopher and you correctly explained... of course he needs to be aware of the order of nodes (but this answer would be rather frustrating than helping when someone already uses the correct order) and if there would have been alpha information it could be used, but he doesnt need to plug it in the Fac input. The image color should work too, especially since it's a black and white image (and obviously works because that's how it's done in the tutorial). And actually Sanbaldo's answer gives the wrong order.

I'm sorry, not that I want to contradict you but the bottom socket is the one that will show up on the white parts of the inputed image on the fac, in this case the clouds are going to get transparent or am I wrong? As the bottom socket is the one Blender puts "on top"

You are wrong, the clouds are white in the image.

Yes the clouds are white, which would make them transparent if you plug the transparent BSDF in the bottom input.

Haha, forget everything, I'm so stupid... I had the screenshot open in a different tab, and in the next the paused video tutorial. I looked at the tutorial :D Anyway, if he would use the rendered preview something would be transparent... it's also frustrating for commenters if people ask their questions and say things like they followed the tutorial exactly... sure, only that you have a different node order and you're using a different preview mode.

I kinda guessed that there was a misunderstanding by reading your comment on Sabnaldo's answer.

Please stop calling poor Sanbaldo "Sabnaldo", haha :D

Oh sorry, I guess I need coffee too.

I'll get one for you, my mug is empty again, too.

try to switch the input nodes of the "mix shader":
- transparent shader should be the 2nd dot, while the diffuse one should be the 3rd input node (alpha channel is ok to be at 1st connection)

I tried that too, didnt work

can you share the file with the textures appended? https://blender.stackexchange.com/questions/82963/how-do-you-share-a-blender-file thanks

did you mean the blender file? how do i share here?

https://drive.google.com/drive/folders/1x9Ln_SNo7olRoslfmHj8Gzb0doqLT3Qn

Try connecting the alpha of the texture to the factor of mix shader node

@BazilAsim your file requires access autorisation, please use pasteall.org/blend or make the file public.

@Sanbaldo The cloud texture is just a black and white image without transparency, which means the Alpha output is completely white and unusable for mixing - so the Color output of the image texture is needed for mixing. The clouds in the image are white, the part where no clouds are (and should be transparent) is black. So the Transparent BSDF needs to be plugged in the second input, and the Diffuse BSDF in the third.

@Nxdhin2005 See my comment above, the image has no transparency and even if, it should still work with the black and white values of the color output.

@GordonBrinkmann your first comment is exactly what Sabnaldo said. Transparent in the second dot and diffuse on the third.

@mqbakamqbaka I guess I need more coffee (see my answer on your comment above). Anyway, alpha doesn't help here and no matter the order, if the rest is done correctly at least something should be transparent.

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/


text:
Blender for iOS without using sidecar or duet?
I'd like to use blender on my iPad. Is there any direct download link for iOS?

why don't you want to use sidecar?

Blender is written in C++, mostly.  Apple requires iOS apps to be written in either Objective-C or Swift and doesn't provide runtime support for C++, so there is no way to run Blender without alternative support.  As far as I know, there is no useable C++ runtime for iOS that would support Blender.

No.
If it were Android, it might be another matter, but no way on iOS.


text:
Blender 2.93 - AttributeError: Operator has no attribute ‘X’
I had an animation export script that was working well in Blender 2.7, but I copied it over to my other computer that’s using Blender 2.9 and it’s not working anymore.
It seems that Blender cannot find the string corresponding to the desired path for the exported file. The script always breaks when I try to open the file path, saying: AttributeError: ‘EXPORT_OT_ss_animation has no attribute ‘filepath’.
I’ve looked through several tutorials, but they’re all using the same approach that I’m using (as well as appear to be written for past Blender versions), so I don’t know what’s going wrong. I did learn that I needed to switch to TOPBAR_MT_file_export from INFO_MT_file_export, but that didn’t fix this new problem.
Here’s the relevant code:
import bpy

class AnimationOperator(bpy.types.Operator):
    bl_idname = “export.ss_animation”
    bl_label = “Export SS Animation”

    filepath = bpy.props.StringProperty(subtype=“FILE_PATH”)

    def execute(self, context):
        exportAnimation(self, context)
        return {‘FINISHED’}

    def invoke(self, context, event):
        context.window_manager.fileselect_add(self)
        return {‘RUNNING_MODAL’}

def exportAnimation(self, context):
    #I claim that what comes before attempting to open the file is irrelevant because none of it references self, but I’ll add it if users disagree with me.

    file = open(self.filepath, ‘w’) #Breaks here; states AttributeError: ‘EXPORT_OT_ss_animation has no attribute ‘filepath’

    #More code follows, but it’s irrelevant because it breaks before getting there

def menu_func(self, context):
    self.layout.operator_context = ‘INVOKE_DEFAULT’
    self.layout.operator(AnimationOperator.bl_idname, text=“Animation Exporter”

def register():
    bpy.utils.register_class(AnimationOperator)
    bpy.types.TOPBAR_MT_file_export.append(menu_func)

def unregister():
    bpy.utils.unregister_class(AnimationOperator)
    bpy.types.TOPBAR_MT_file_export.remove(menu_func)

if __name__ == ‘__main__’:
    register()

Just replace filepath = bpy.props... by filepath : bpy.props... . As of 2.93 you have to use annotations. Remove support for non-annotation properties in classes... from: https://wiki.blender.org/wiki/Reference/Release_Notes/2.93/Python_API

Ah, that did it! Thanks! Now to fix the cascade of remaining errors... >.<

As of Blender 2.93 you have to use annotations. Support is dropped for 'non-annotation' properties.
From https://wiki.blender.org/wiki/Reference/Release_Notes/2.93/Python_API:

Remove support for non-annotation properties in classes as this was only enabled while porting scripts to 2.8x API (afa5da9ce0)

Means in practice, just replace the assignment operator = for your properties by a colon :
filepath = bpy.props.StringProperty() # OLD
filepath: bpy.props.StringProperty()  # NEW


text:
World texture doesn't show no matter what only in Cycles
No matter if it's an environment texture or just a solid color it shows black.
I've even tried import worlds I made in other files

Is "World.001" assigned to the scene? Properties > World Properties?

yes it is. it even shows the texture on the little preview thing

Suggest share your blend: https://blend-exchange.com/

my file is 30.8mb

i uploaded it to here https://filebin.net/0rdibfsos6ys08u5

"This bin is empty." We are only interessted in the world settings so you can delete all irrelevant objects and textures to reduce the file size. However, don't forget to pack the HDRI.

yeah it's still uploading the site is slow only 50kbps.but ok Ill copy and it clear objects out

No issue here. Switch to the Shading workspace and enable Scene World, see: https://i.sstatic.net/fmsRD.png

that's weird it actually worked once i unchecked lights

Your Environment is disabled in View Layer Properties > Filter:

Nice find! That's it...

thanks although brock did help i still only saw 1 color now this fixed it


text:
How to assign a material to a mesh object with python?
Creating Materials using python is easy and it has a lot of answers on StackExchange.
Now what I want to ask is -
If I want that the material should only be added if the object (on which material to be added) should be mesh or text,
and material should not be added in case of curves or anything else and it should give a custom error message.
Whenever the add test material button is pressed operator should only be executed if the object is mesh.
Actually I want to specify in the script that this material to be added only if the object type is mesh.
(Please have a look at the script)
import bpy

class TEST_MATERIAL_OT_add_material(bpy.types.Operator):
    bl_idname = "test_material.add_material"
    bl_label = "Add Test Material"
    bl_description = "This button will add a material to your object"

    @classmethod
    def poll(cls, context):
        ob = context.active_object
        return ob is not None and ob.type=='MESH'

        def execute(self, context):
            ob = context.active_object

            if ob is None:
                self.report({'ERROR'}, "No active object")
                return {"CANCELLED"}

            if ob.type != 'MESH':
                self.report({'ERROR'}, "Object is not a mesh")
                return {"CANCELLED"}

            self.report({'INFO'}, "Object is a mesh, operator can run")

            self.create_material()
            return {'FINISHED'}

    def create_material(self):

        # removes unwanted nodes
        for node in tree.nodes:
            tree.nodes.remove(node)

        test_shader_mat = bpy.data.materials.new("TestMat")
        mesh = bpy.context.object.data
        mesh.materials.clear()
        mesh.materials.append(test_shader_mat)
        bpy.context.object.active_material.use_nodes = True

        for mat in bpy.data.materials:
            if "TestMat" in mat.name:
                nodes = mat.node_tree.nodes
                for node in nodes:
                    if node.type != 'OUTPUT_MATERIAL':  # skip the material output node as we'll need it later
                        nodes.remove(node)

        # Creating Node Group Test_Material
        group = bpy.data.node_groups.new(type="ShaderNodeTree", name="Test_Material")

        # Creating Group Input
        group.inputs.new("NodeSocketColor", "Diffuse Color")
        group.inputs.new("NodeSocketColor", "Glossy Color")
        group.inputs.new("NodeSocketFloat", "Mix Factor")
        group.inputs.new("NodeSocketFloat", "Glossyness")
        input_node = group.nodes.new("NodeGroupInput")
        input_node.location = (-800, 0)

        # Creating Group Output Node
        group.outputs.new("NodeSocketShader", "Diffuse Color")
        group.outputs.new("NodeSocketShader", "Glossy Color")
        group.outputs.new("NodeSocketShader", "Mix Output")

        output_node = group.nodes.new("NodeGroupOutput")
        output_node.location = (1500, 0)

        # Creating Diffuse Node
        diffuse_node = group.nodes.new(type='ShaderNodeBsdfDiffuse')
        diffuse_node.location = (150, 100)

        # Creating Glossy Node
        glossy_node = group.nodes.new(type='ShaderNodeBsdfGlossy')
        glossy_node.location = (300, 250)

        # Creating Mix Shader Node
        mix_shader_node = group.nodes.new(type='ShaderNodeMixShader')
        mix_shader_node.location = (450, 100)

        # Creating Links Between Nodes
        group.links.new(diffuse_node.outputs["BSDF"], mix_shader_node.inputs[1])
        group.links.new(glossy_node.outputs["BSDF"], mix_shader_node.inputs[2])
        group.links.new(input_node.outputs["Diffuse Color"], diffuse_node.inputs[0])
        group.links.new(input_node.outputs["Glossy Color"], glossy_node.inputs[0])
        group.links.new(input_node.outputs["Mix Factor"], mix_shader_node.inputs[0])
        group.links.new(input_node.outputs["Glossyness"], glossy_node.inputs[1])
        group.links.new(output_node.inputs["Diffuse Color"], diffuse_node.outputs[0])
        group.links.new(output_node.inputs["Glossy Color"], glossy_node.outputs[0])
        group.links.new(output_node.inputs["Mix Output"], mix_shader_node.outputs[0])

        # Putting Node Group to the node editor
        tree = bpy.context.object.active_material.node_tree
        group_node = tree.nodes.new("ShaderNodeGroup")
        group_node.node_tree = group
        group_node.location = (-40, 300)
        group_node.use_custom_color = True
        group_node.color = (1, 0.341, 0.034)
        group_node.width = 250

        shader_node_output_material_node = tree.nodes["Material Output"]
        links = tree.links
        links.new(group_node.outputs[0], shader_node_output_material_node.inputs[0])

class TEST_MATERIAL_PT_layout_panel(bpy.types.Panel):
    bl_label = "Test Material Node"
    bl_category = "Test Material"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"

    def draw(self, context):
        layout = self.layout
        layout.operator("test_material.add_material", icon='IMPORT')

classes = (TEST_MATERIAL_OT_add_material, TEST_MATERIAL_PT_layout_panel)

def register():
    for cls in classes:
        bpy.utils.register_class(cls)

def unregister():
    for cls in classes:
        bpy.utils.unregister_class(cls)

if __name__ == "__main__":
    register()

Can anyone help me in applying the solution to this given script in the question?

It's hard to tell what exact functionality you are after and in what context. Maybe see the script examples in the Text Editor's Templates menu. That might be helpful. Like brockmann mentioned poll might be what you are after. You will see how it's used in the templates.

actually, this script is working currently and is creating a material with few nodes in it, but by mistake, while clicked on camera I clicked the button to add material and this created an error location: :-1
Error: Traceback (most recent call last):
File "\Text", line 22, in execute
File "\Text", line 35, in create_material
AttributeError: 'Camera' object has no attribute 'materials'
location: :-1

and then I just clicked on cube and again clicked on the button, but  blender refused to add material and showed an error  AttributeError: 'NoneType' object has no attribute 'nodes', so to fix this problem I was thinking that what should be done, and I don't know python very much I am just earning watching tutorials, so I needed help

@Martynas Žiemys  poll may work but I don't know how to do that so, please help with a detailed solution

Please see the operator examples in the Text Editor's Templates menu. Poll is a classmethod(sort of a function) that defines conditions the operator is available in. It can be defined inside your operator as you would see in the examples. If it returns true, the operator becomes available. So if you put return context.object.type == 'MESH' the operator will only be available if the active object is of 'MESH' type. I am not sure if that's what you want to do or you want to go through some objects and then only act on the ones that are meshes.

Yep, it would really make sense to start from the beginning and to define exactly what you want.

@Martynas Žiemys Thanks! Actually, starting from the beginning, I don't know Python and I wanted to create a material with node group in it, and this material is only to be created when the button in a panel is clicked. this was the idea in my mind and I started asking and viewing questions on the StackExchange and collected all the pieces of code and combining them, I finally made the script which worked as I expected, but I ran into a problem when I clicked on a camera and clicked the button in a panel and it showed me the errors(which I have told in above comment).

So, yes, the poll method will fix this. That's the solution, just study the examples until you get how it works.

@brockmann as you said I am not willing to communicate with....  this is not true, I am sorry if you thought like that, actually, your answers were somewhat of high level to me to understand that's why I was hesitating to communicate with you, as I thought asking silly questions to you will make you irritated and that's why I preferred talking to Martynas Žiemys as he was a bit more friendly, I hope you understood the scene, Now you have given a very good detailed solution and that is what I needed earlier. Thank you!

I rolled back your title. Iif you have another question, please ask a new one. Our answers would be off otherwise.

To test whether the object is a mesh, you can ask for Object.type:
>>> C.object.type
'MESH'

For multiple objects, you can use a list comprehension:
>>> [o for o in C.selected_objects if o.type=='MESH']
[bpy.data.objects['Cube'], bpy.data.objects['Icosphere']]

API on Object.type:

Type of Object
Type of Object
  Type:   enum in [‘MESH’, ‘CURVE’, ‘SURFACE’, ‘META’, ‘FONT’, ‘ARMATURE’, ‘LATTICE’, ‘EMPTY’, ‘GPENCIL’, ‘CAMERA’, ‘LIGHT’, ‘SPEAKER’, ‘LIGHT_PROBE’], default ‘EMPTY’, (readonly)

In case you want to assign a material to the 'active object' using a custom operator, you can add a poll() method to limit the scope to mesh objects. poll() basically allows to adding a custom check if the operator can run even before executing, read: What do operator methods do?.
@classmethod
def poll(cls, context):

    # Get the active object in context
    ob = context.active_object

    # Returns True if there is an active object and the object is a mesh
    return ob is not None and ob.type=='MESH'

In other words: the execute() method of your operator is only called in case  there is an 'active object' and if its type is a 'mesh'.

To be on the safe side, you can add the same checks to your execute method and report potential errors to the Info Area, read: Is it possible to print to the Report window in the Info view?
def execute(self, context):

    # Get the active object in context
    ob = context.active_object

    if ob is None:
        self.report({'ERROR'}, "No active object")
        return {"CANCELLED"}

    if ob.type != 'MESH':
        self.report({'ERROR'}, "Object is not a mesh")
        return {"CANCELLED"}

    self.report({'INFO'}, "Object is a mesh, operator can run")

    # Assign the material here
    # ....

    return {'FINISHED'}

To assign the material, read: How to assign a new material to an object in the scene from Python?
Also notice

You already have context which is passed to the operator methods, use it! I'd suggest pass it to create_material(self, context) as well in order to get eg. the same reference to the object context.active_object instead of using bpy.context.active_object
def create_material(self, context):

    # Get the active object in context
    ob = context.active_object

    # Get the active material of ob
    mat = ob.active_material
    #...

context.scene.use_nodes = True adds the default nodes to the Compositor so it has nothing to do with materials
I suggest add bl_options = {'REGISTER', 'UNDO'} to the operator which allows the user going back in case

I think you agree that adding materials is not that simple and there is a lot to think about.

Ok, this gave me the solution, but I am stuck in another problem the answer will work if the object is a mesh type but what if I want that, this material can also be added to the text object, can I do this  -  return ob is not None and ob.type==['MESH', 'FONT']

Usually something like if ob.type in ('MESH', 'FONT'): is what you want (testing items in tuple using in operator). Suggest take a basic python course or have a look at stackoverflow: https://stackoverflow.com/a/15112149 @Rakeshchoudhary You're welcome.

Thank you very much and I am joining course now instantly

In a bit more simple terms:
Just go through the objects and check if the type is 'MESH'
For example if you wanted to go through all the selected objects you could do something like this:
import bpy

m = bpy.data.materials.new('Some New Material')

for o in bpy.context.selected_objects:
    if o.type == 'MESH':
        if len(o.material_slots) < 1: #if no materials on the object
            o.data.materials.append(m)
            #this will create a slot and add the material
        else:
            o.material_slots[o.active_material_index].material = m
            #if there are slots, assign the material to the active one

You can obviously go through all the objects in your file(bpy.data.objects), or all the objects in the active scene(bpy.context.scene.objects) or whatever other list of the objects you wish to work with.

I don't understand why to be honest. I would probably check if material exists before making it, but if it does, why not just address it by the name then? get() is probably faster then checking if 'Some Material' in bpy.data.materials, isn't it?

it is not needed to check whether the material is already existing or not, because this script will add another material on the object. what I wanted was what and where should I add a piece of code so that this script checks the type of object before adding material and then whenever the button is pressed, the material is only added if it is mesh, if not, the mesh then the blender should print a custom message to the console.

Oh, so all of this is happening in an operator?.. I am not sure I understand the question any more. :D

Finally, I got a solution to my question, before that I would like to thank Martynas Žiemys
and brockmann as they tried solving my question.
I got the hint from this post
Back to the solution - It just needed this if statement before creating the material
and this worked for me
active = bpy.context.active_object
    if active.type == "MESH":

Agree with comments: This is really the job of the poll classmethod.  Polling via the if statement, return context.active_object and context.active_object.type == 'MESH' on operator class will make operator button disabled in panel, or on panel class, make the panel not show. (Notice the use of context from the method arguments)  In general an operator works on all the selected objects, hence the other answers given.    Having an operator "do nothing" as suggested by this answer will work, but is not good practice.  Also the other answers  IMO are about 99.9% of the way there.


text:
Procedural material broken in 2.81

How it's meant to look^
I downloaded this wonderful procedural shader setup by Elbriga, which has worked fine in Blender 2.8 – but when I got the new 2.81 version the material preview is broken for some reason. I can't figure out what's wrong.

How it looks^
Download Link: https://www.cyn-prod.com/projects/wood.php

Looks fine to me in 2.81 both in Material Preview and Rendered.

Huh, no issues here. Even with Eevee it looks some kind of ok...

Huh that's odd. Wonder what's janked in my setup. Thanks for the replies! I'll see if I start a new project and see what happens.

Nope. Even if I start a new file and link/append the material its still messed up. OS is up to date and all.

@brockmann are you using Windows or macOS? Could it be a Apple thing because I'm using a mac? I even tried 2.82 Alpha version but still the same - multicolored mess.

Linux @Woody ...

@brockmann ah of course, my bad to exclude Linux. Well it seems a macOS problem, had no issues on my PC. Thanks for all the help!


text:
Transparent BSDF cause noise in depth layer
I have system that consumes depth and RGB output of Cycles renderer.
I can observe noise in depth maps when I use transparent BSDF with Mix shader and RGBA texture. Let's look at sample simple shader:

That shader is giving material that is transparent with level of transparency given by alpha channel of texture.
I am not happy with depth image, especially on edges (white dots):

Two factor has to be present to "depth" noise appears:

There must be some other object behind the part that is transparent.
The noise seems to be absent when alpha channel has only value 255 or 0.

A this moment I found some solutions:

using mist pass
using material override

First solution seems to give depth values in some bizzare scale (I need it linear in meters, like Z-pass) and the noise is still present.
Second solution is not acceptable, because removes desired feature.

I think that it is normal behavior, same issue appears in mist pass.
During mist pass / z-pass mixa shaders with transparent shader cause that some of rays do not contribute to image output. I resolved it introducing contrast node before mix shader to keep mixing rate 0 or 1.


text:
Particle children "simple" stop showing on certain frame
I'm simulating particles with boolean object as the emitter and icosphere as particle.
Adding simple children was fine, but when it hits a certain frame (43 to be exact), the children just gone on display and in render.
Tried several things that I thought could've been the quirk, like;

changing numbers of particles,
moving the boolean mesh so it won't completely disappear
deleting cache manually

Anything I should tweak? Or is there a workaround?
Thanks in advance

Just found out, the culprit is the Boolean.
Tweak translation of intersecting objects to make it work.


text:
Position multiple vertex to an exact location without changing shape of object
I have 3 equilateral triangles.
The red triangle is the base and then at 90 degrees I have two green other triangles.
View 1 and 2 shows this setup from two different angles.

Below I have a kite like shape that I have marked as (P) that I want to place against the two green triangles.

As you can see in image 4 ... I'm having a really hard time getting the 3 vertex's on shape P to be places exactly on the vertex's for the two green triangles.
Everything I try either changes the shape of the object .. or as I move one vertex I change the position of another vertex that I have already placed correctly.
Here's a link the file itself: enter link description here

In which position do you start with the "P" face, maybe flat on the xy plane?

Yes, flat on the x,y

May i ask if the "P" face has certain measurements that need to be kept, as it may be easier to create the shape in place if for example the length from the lowest to the top were known.

Yes P has exact measurements that I used to create it while flat on the xy .. I probably could create it in place with some trouble but I want to keep the parts as I plan to animate the parts later on. More than anything it's just annoying me that I can't find a way to do it :)

I ask as i had no measurements, so i had to create one in place and get that then flat on the xy plane XD .. right now working on a way to get it then back in place .. XD

I added a link to the blender file in the description also, sorry should have maybe added it to begin with https://vsolution.box.com/s/e8blc0vklqgea99e0lgymgotmlfpdhim

Just a comment on what you see there. I have very painfully moved the two you see into position at the moment. It looks pretty close, but I can't help think there must be a better way

Based on the comments i build the setup myself, created the "P" face as it was called in place, took it down flat according to comments again and then started working it back in place.
Here a visual step by step:

It's based on the following:

Begin by creating a support triangle.
For that use K knife tool and hold Ctrl to snap on the middle of the base triangle edge that lies opposite of the tip where the "P" face has to go.
Select the top 2 vertices from each of the "green" standing triangles and press F to generate an edge between them.
Select the edge and press Ctrl+R to cut the edge in half, confirm with Enter
Now create a triangle from the new created vertex and the 2 vertices along the cut you made through the triangle. This will help aligning the "P" face.
Now go to the "P" face and in edit mode, then press Shift+S to snap the cursor to the selected vertex on the thin "P" face tip.
Go in object mode and set the origin to the cursor using the context-menu.
Switch to the other object and select the vertex where the thin tip of the "P" face has to go, snap the cursor there.
Back to the "P" face object use Shift+S "snap selected to cursor"
The "P" face object is now at least with the tip at the right location.
Adjust the settings for the snapping like so:

Now it's important that all vertices of the "P" face object are selected, BUT the last selected(active) vertex has to be the one at the tip opposite the thin tip where the origin is.

Press R, followed by Z, locking the rotation to Z axis and then hold Ctrl to snap based on the active vertex onto the vertex the support triangle, where it divides the base triangle edge.
Now back to the base object, in edit mode select one of the 2 edges of the divided edge on the base triangle opposite to the thin tip of the "P" face.
With the edge selected create a custom orientation like this:

It will create and select a custom orientation we need to rotate the "P" face.
Back to the "P" face object, select again all vertices of and make sure the last/active vertex is the one like we used last. Opposite the thin side.
Now press R, followed by Y (is the axis of the custom orientation we need), then hold Ctrl and snap based on the active vertex onto the top vertex of the support triangle.
All that is now needed is cleaning up the support triangle.
If you have multiple "P" faces that need to be placed, you can create a duplicate it and after removing the custom orientation snap each copy to the 2 other corners of the base object, after which you only need to rotate them with R, followed by Z with 120 degree either plus or minus.

With one extra "P" face it should then look like this:

I have looked at the file, and i had to notice that the "P" faces were slightly too long...

Little extra, as i was already mostly done with the answer:
To round it up i think it might help showing you how i build the version i used:

Add a circle mesh with 3 vertices, radius 1
Select an edge and create a custom orientation from it.
Snap the cursor to the edge
Select the vertex opposite the edge, copy it with Shift+D, cancel with RMB to leave it where it was.
Press R, then Y followed by -90 to position the vertex where it needs to be to form a new triangle you can now build by selecting the new vertex and the two on each side of the edge in between which the cursor is.
Do the same on the other side and you have the 2 "green" triangles standing.
Now select the 2 vertices each top of the "green" vertices and press F to create an edge between them.
Cut the edge with Ctrl+R, confirmed with LMB.
Select that new vertex and the vertex in the corner where the "P" face thin side will be and press F, creating an edge we can use to find the opposite tip of the "P" face.
Looking from top, select the vertex between the tips of the 2 "green" triangles and press G twice to start sliding the vertex along the long edge downwards.
While in this slide mode, press C to disable the clamping.
Now move along the long edge and over the cross-section towards the center of the base triangle. We can sadly not snap in this mode yet, but you will find that the closer to 0 on x and y you come the more you come closer to 2 on Z.
That said, with the values used the exact position would be 0,0,2.
Now with the vertex in place, you can create a face on each side and then dissolve the edge in the middle.

Based on what values you used i believe it should have come to fit, but since the version in the file was overlapping, either moving the vertices caused that or some measurements could have been slightly off.
Happy Blending.

wow, I'm learning SO MUCH from your answer. Thank you ... I'm rather new to Blender and don't want to ask 100 stupid questions as I walk though this. Incredible response, thank you so much. Plan to go through this in detail this evening. Currently having a problem at step 13 for some reason it's just not snapping the way your is so I'm doing something silly. Will keep you posted, thanks again.

I added the picture from the gif that shows the step before 13, as it is very important and might be a bit harder to understand from the text version then the picture.

This was hands down the best response I've ever received, thank you again so much. I really learnt a lot from this. To start with I realized that I didn't understand how the snapping works.. then the custom orientations .. had no idea those exists. Excellent stuff, thank you sir!

You can try snapping to vertex or edge.

no unfortunately this doesn't seem to have the effect I'm looking for.


text:
Extruding straight down
I'm new to blender and I don't even seem to be able to extrude my faces straight down. I'm creating the base mesh for a shirt, but I keep extruding faces at different angles. Some help would be appreciated!

Immediately after typing E (extrude), type Z twice: first to override the default direction (along the faces' normal), then to constrain the extrusion along the Z axis.

    (E, Z, Z, move, Enter. Note "along global Z" on the bottom bar)

To add on this: you can constrain to an axis - X, Y or Z - also the other familiar operations G (move), R (rotate) and S (scale).
Similarly, Shift+Z constrains the transformation to all axes except Z.
Finally, selecting an axis twice means that the axis local to the object's internal coordinates is used, rather than the global one.

Thank you so much. It is a really frustrating learning process, but this certainly helps me a step further!

Note that pressing Z twice will only transform along the Local axis if that is the transform orientation chosen in the 3D view header.


text:
Scripting: transferring shape keys between different meshes?
I know that shapekeys can be transferred between meshes of similar topology with ease.
My case involves transferring shape keys from ManuelBastioni Lab Character Face to the moustache.
I have written a small script which helped me get this done, however it takes really long to execute.
I'm a novice to python and blender scripting and hope you can advise me about improving this code or provide an alternative solution.
In this solution the time can be improved by deleting parts of the source mesh which you think should not affect the destination mesh.
#sorry if this script is poorly written.
#Originally created to transfer face shapekeys from Manuel Bastioni character face to a moustache made with mesh cards
#Please ensure that the destination and source meshes have the same names and number of shape keys
#place both the meshes at origin and overlap them with similar scale
#To quickly copy shape key names join both meshes and then separate them. Now destination mesh has the same names as source mesh
#import required modules
import bpy
import bmesh
from mathutils import Vector
from time import sleep
import datetime

# commonly used references
scene = bpy.context.scene
context = bpy.context

# step size to increase the sphere selection
increment_radius = .5

#set total vertices incase you want to run for less number of vertices also set specify_end_vertex to True
#set current_vertex index incase you want to continue from another index
#use_one_vertex will transfer the weight of the first vertex with the selection sphere
current_vertex_index = 0
total_vertices = 0
specify_end_vertex = False
use_one_vertex = False

#name of source mesh
src = "man"
#name of destination mesh
dest= "moustache"

#global variables which should not be set
key_name = ""
dest_mesh = None
src_mesh = None
dest_shape_key = None
dest_shape_key_index = 0
src_shape_key = None
src_shape_key_index = 0

print("*************************************************")
def deselect_all():
    for ob in bpy.context.selected_objects:
        ob.select = False

deselect_all()

bpy.ops.object.select_pattern(pattern=dest)
dest_mesh = bpy.context.selected_objects[0]
print(dest_mesh.name)

deselect_all()
bpy.ops.object.select_pattern(pattern=src)
src_mesh = bpy.context.selected_objects[0]
print(src_mesh.name)

if(specify_end_vertex == False):
    total_vertices = len(dest_mesh.data.vertices)
    print("Total vertices: ",total_vertices )

#select required vertices within a radius
def select_vertices(center, radius):
    global src_mesh
    n = 0
    src_current_vertices = []
    one_vertex = []

    bms = bmesh.new()
    radius_vec = center + Vector((0, 0, radius))
    me = src_mesh.data
    mwi = src_mesh.matrix_world.inverted()
    # put sphere in local coords.
    lco = mwi * center
    r = mwi * (radius_vec) - lco
    closest_length = r.length

    # load mesh
    bms.from_mesh(me)
    # select verts within radius
    for index, v in enumerate(bms.verts):
        v.select = (v.co - lco).length <= r.length
        n += v.select
        if(v.select):
            src_current_vertices.append(index)
            if(use_one_vertex):
                if((v.co - lco).length <= closest_length):
                    closest_length = (v.co - lco).length
                    one_vertex = []
                    one_vertex.append(index)

    # flush selection, update mesh
    bms.select_flush(False)
    bms.to_mesh(me)
    bms.clear()
    bms.free()
    #selects only index 0 of close vertices as reference
    if(use_one_vertex):
    if(n != 0 ):
        src_current_vertices = []
        src_current_vertices.append(one_vertex[0])
        n = 1
    # appending the length of the array to the end... I know i could use len() but want to be able to return a -1 incase no vertices are selected
    src_current_vertices.append(n)
    return src_current_vertices

#this select function initially starts (if level=0) by matching a point in same space as the source mesh and if it cant find similar positioned point we increment search radius
def select_required_verts(vert,rad,level=0):
    if(level > 20):
        return -1
    verts = []
    verts = select_vertices(vert, rad)
    n = verts.pop()
    if n == 0:
        return select_required_verts(vert,rad + increment_radius, level + 1)
    else:
        verts.append(n)
        return verts

#set the new vertex position on the shape key
def set_vertex_position(v_pos):
    global current_vertex_index
    bmg = bmesh.new()
    bmg.from_mesh(dest_mesh.data)
    bmg.verts.ensure_lookup_table()
    layer_name = bmg.verts.layers.shape.get(key_name)
    bmg.verts[current_vertex_index][layer_name] = v_pos
    bmg.to_mesh(dest_mesh.data)
    bmg.free()

def update_vertex():
    global current_vertex_index
    global total_vertices
    global dest_mesh
    global src_mesh

    if(current_vertex_index >= total_vertices ):
        return

    bpy.ops.object.select_pattern(pattern=dest)
    obj = context.active_object
    current_vertex = obj.matrix_world * dest_mesh.data.vertices[current_vertex_index].co
    print("Current vertex", current_vertex_index, " ", current_vertex)
    deselect_all()
    bpy.ops.object.select_pattern(pattern=src)
    src_current_vertices = select_required_verts(current_vertex,0)

    n = src_current_vertices.pop()
    if(n == -1):
        print("FAIL")
        return
    deselect_all()

    src_total_distance = 0
    src_directions = []
    src_distances  = []

    bpy.context.object.active_shape_key_index = src_shape_key_index
    src_shape_key.value = 0
    bpy.ops.object.select_pattern(pattern=src)

    me = src_mesh.to_mesh(scene, True, 'PREVIEW')
    result_position = Vector()

    for v in src_current_vertices:
        result_position += me.vertices[v].co

    bpy.data.meshes.remove(me)

    result_position /= len(src_current_vertices)

    #Calculate new positions
    src_shape_key.value = 1
    me = src_mesh.to_mesh(scene, True, 'PREVIEW')
    result_position2 = Vector()
    for v in src_current_vertices:
        result_position2 += me.vertices[v].co
    bpy.data.meshes.remove(me)
    result_position2 /= len(src_current_vertices)

    result = result_position2 - result_position + current_vertex

    bpy.ops.object.select_pattern(pattern=dest)
    bpy.context.scene.objects.active = dest_mesh
    bpy.context.object.active_shape_key_index = dest_shape_key_index
    src_shape_key.value = 0
    set_vertex_position(result)
    bpy.context.object.active_shape_key_index = 0
    current_vertex_index += 1

#store shapekey index and reference in global variables
def get_shapekey(p_key_name):
    global dest_shape_key
    global dest_shape_key_index
    global src_shape_key
    global src_shape_key_index
    deselect_all()
    for index, sk in enumerate(dest_mesh.data.shape_keys.key_blocks):
        if sk.name == p_key_name:
            dest_shape_key = sk
            dest_shape_key_index = index

    bpy.context.object.active_shape_key_index = dest_shape_key_index
    dest_shape_key.value = 0
    deselect_all()

    for index, sk in enumerate(src_mesh.data.shape_keys.key_blocks):
        if sk.name == p_key_name:
            src_shape_key = sk
            src_shape_key_index = index
    bpy.context.object.active_shape_key_index = src_shape_key_index
    src_shape_key.value = 0
    deselect_all()

#Iterate all shape keys in src mesh and get its reference and index and then update vertex positions
for shape_key_iter in src_mesh.data.shape_keys.key_blocks:
    global key_name
    key_name = shape_key_iter.name
    #exclude basis shapekey and Expressions_IDHumans_max (used in Manuel Bastioni Lab
    if(key_name!='basis' and key_name!='Expressions_IDHumans_max'):
        get_shapekey(shape_key_iter.name)
        while(current_vertex_index < total_vertices):
            update_vertex()
        current_vertex_index = 0
        dest_shape_key.value = 0

Link to blend file download

Have you tried profiling your code?

Thanks for this suggestion. I haven't tried that yet. I will post back after implementing the updates suggested by Blender Dadaist.

Always try and avoid calling operators multiple times in a script. (update_vertex(...) method above for instance)  Can you provide a run down of the theory behind  method you are using in code above to transfer shapekeys? . Have you considered 3 vertex parenting, moustache to man?

There is a for loop at the end which runs update_vertex() which updates 1 vertex inside 1 shapekey (indexes for vertex and shapekey are global sry... :/)
update vertex  first gets surrounding vertices in src mesh around a vertex in dest mesh. After getting a mean of the affecting vertices copies new position to dest mesh vertex. Then increment dest mesh vertex. Repeat for all vertices. increment shape key index. Repeat for all shapekeys. I plan to export the model for use in unreal engine so cant use vertex parenting.

Thank you everyone for your awesome advice!
The improved code is as follows and it completes in ~ 4 seconds for my test blend provided. (which is a big improvement from ~5 mins)
I hope that someone can make this into a button in blender.
# sorry if this script is poorly written. I am a n00b
# Originally created to transfer face shapekeys from Manuel Bastioni character face to a moustache made with mesh cards
# place both the meshes at origin and overlap them with similar scale
# import required modules
# I hope that the basis key is always located at index 0
import bpy
import bmesh
from mathutils import Vector
from time import time
start_time = time()
# step size to increase the sphere selection
increment_radius = .05

# set total vertices incase you want to run for less number of vertices also set specify_end_vertex to True
# set current_vertex index incase you want to continue from another index
# use_one_vertex will transfer the weight of the closest vertex within the selection sphere
current_vertex_index = 0
total_vertices       = 0
specify_end_vertex   = False
use_one_vertex       = True

# name of source mesh
src_name  = "man"
# name of destination mesh
dest_name = "moustache"
# shape keys to ignore
excluded_shape_keys = ['basis', 'Expressions_IDHumans_max']

# global variables which should not be set
dest_mesh            = None
src_mesh             = None
src_mwi              = None
dest_shape_key_index = 0
src_shape_key_index  = 0
do_once_per_vertex   = False
src_chosen_vertices  = []
current_vertex       = None

# select required vertices within a radius and return array of indices
def select_vertices(center, radius):
    global src_mesh, src_mwi
    src_chosen_vertices = []
    closest_vertex_index = -1
    radius_vec = center + Vector((0, 0, radius))
    # put selection sphere in local coords.
    lco = src_mwi * center
    r   = src_mwi * (radius_vec) - lco
    closest_length = r.length

    # select verts within radius
    for index, v in enumerate(src_mesh.data.shape_keys.key_blocks[0].data):
        is_selected = (v.co - lco).length <= r.length
        if(is_selected):
            src_chosen_vertices.append(index)
            if(use_one_vertex):
                if((v.co - lco).length <= closest_length):
                    closest_length = (v.co - lco).length
                    closest_vertex_index = index

    # update closest vertex
    if(use_one_vertex):
        src_chosen_vertices = []
        if(closest_vertex_index > - 1):
            src_chosen_vertices.append(closest_vertex_index)

    return src_chosen_vertices

# this select function initially starts (if level=0) by matching a point in same space as the source mesh and if it cant find similar positioned point we increment search radius
def select_required_verts(vert,rad,level=0):
    verts = []
    if(level > 20):
        return verts
    verts = select_vertices(vert, rad)
    if(len(verts) == 0):
        return select_required_verts(vert,rad + increment_radius, level + 1)
    else:
        return verts

# set the new vertex position on the shape key
def set_vertex_position(v_pos):
    global current_vertex_index, dest_shape_key_index, dest_mesh
    dest_mesh.data.shape_keys.key_blocks[dest_shape_key_index].data[current_vertex_index].co = v_pos

# update 1 vertex of destination mesh
def update_vertex():
    global current_vertex_index, total_vertices, dest_mesh, src_mesh, src_chosen_vertices, do_once_per_vertex, current_vertex

    if(current_vertex_index >= total_vertices ):
        return

    if(do_once_per_vertex):
        current_vertex = dest_mesh.matrix_world * dest_mesh.data.shape_keys.key_blocks[0].data[current_vertex_index].co
        src_chosen_vertices = select_required_verts(current_vertex,0)
        do_once_per_vertex = False;

    if(len(src_chosen_vertices) == 0):
        print("Failed to find surrounding vertices | Try increasing increment radius | vertex index ", current_vertex_index, " at shape key index ", src_shape_key_index)
        current_vertex_index += 1
        return

    result_position = Vector()
    for v in src_chosen_vertices:
        result_position +=  src_mesh.data.shape_keys.key_blocks[0].data[v].co
    result_position /= len(src_chosen_vertices)

    result_position2 = Vector()
    for v in src_chosen_vertices:
        result_position2 += src_mesh.data.shape_keys.key_blocks[src_shape_key_index].data[v].co
    result_position2 /= len(src_chosen_vertices)
    result = result_position2 - result_position + current_vertex
    set_vertex_position(result)

# store shapekey index and reference in global variables
def update_global_shapekey_indices(p_key_name):
    global dest_shape_key_index, src_shape_key_index
    for index, sk in enumerate(dest_mesh.data.shape_keys.key_blocks):
        if sk.name == p_key_name:
            dest_shape_key_index = index
    for index, sk in enumerate(src_mesh.data.shape_keys.key_blocks):
        if sk.name == p_key_name:
            src_shape_key_index = index

dest_mesh   = bpy.data.objects[dest_name]
src_mesh    = bpy.data.objects[src_name]
src_mwi     = src_mesh.matrix_world.inverted()

if(specify_end_vertex == False):
    total_vertices = len(dest_mesh.data.vertices)
    print("Total vertices: ",total_vertices )

# Check if dest_mesh has any shape key if not create one
if(not hasattr(dest_mesh.data.shape_keys, "key_blocks")):
    dest_mesh.shape_key_add(name="basis")
# add missing shape keys to dest_mesh
for src_shape_key_iter in src_mesh.data.shape_keys.key_blocks:
    valid_shape_key = False
    for dest_shape_key_iter in dest_mesh.data.shape_keys.key_blocks:
        if(src_shape_key_iter.name == dest_shape_key_iter.name):
            valid_shape_key = True
    if(not valid_shape_key):
        dest_mesh.shape_key_add(name=src_shape_key_iter.name)

# all vertices in destination mesh
while(current_vertex_index < total_vertices):
    do_once_per_vertex = True
    # Iterate all shape keys
    for shape_key_iter in src_mesh.data.shape_keys.key_blocks:
        key_name = shape_key_iter.name
        # exclude shapekeys not needed
        if(not (key_name in excluded_shape_keys)):
            update_global_shapekey_indices(shape_key_iter.name)
            update_vertex()
    current_vertex_index += 1

print("Total Time: ", time() - start_time)

In my opinion, to access shape key data you don't need a bmesh. You can save a lot of time by doing away with the conversion between bmesh to mesh and the related bpy.ops calls (done iteratively in the code) .
Maybe here's how the problem could be approached:

Get the src and dest objects (bpy.data.objects[name_of_the_obj])
loop through the srcObj.data.shape_keys.key_blocks

for each key block you will get the coordinate vector, modified for that shape key, in key_blocks[x].data[y].co where x is the shape key index and y is the index of the vertex
For the destination vertex with index idx, set the new coordinates by changing the value of destObj.data.shape_keys.key_blocks[a].data[idx].co = newCo, assuming the shape key in src with index x corresponds to that with index a in dest. I believe, you already have the logic for finding the src-dest vertex mapping
if there's no corresponding shape key, you can add it by calling obj.shape_key_add, this will return the new key_block object


text:
UV Vertex Question
I'm currently tidying up a UV mesh so the texture displays properly. Is there any way of moving more than one vertex at the same time when organising their position? For instance, I would like to move the five highlighted vertices together, but whenever I click and hold the mouse button, they unselect and only one remains highlighted.

Thanks

Ok, I've been reviewing your mesh and I think the problem is the way you're trying to move the vertices, so why don't you try selecting the vertices (press C and then select them).

Then press G to move them, instead of holding the mouse button.

Yeah, I probably shouldn't have saved that screenshot with Face selection mode selected... But even with Vertex selection, they still don't all move at the same time. Doing it via Edge and Face select does make it a bit easier though.

Wow that's weird. Can you provide the blend file to take a look?

I've edited the original post


text:
Why are these buttons performing the same operation?
I'm writing a simple script that will help me use Blender better.
One script sets everything up that's needed for retopology. The second just makes a hexagon and fan fills its face.
Individually, I can get these scripts to function correctly, but when I add them both together, or when I add them as separate scripts, the one that executes first will be the operation that both buttons will be caused to execute.
bl_info = {
    "name": "Dope Tools",
    "author": "Digital Dope",
    "version": (1, 0),
    "blender": (2, 79, 0),
    "location": "View3D > Add > Mesh > New Object",
    "description": "Adds several features to blender that I need",
    "warning": "",
    "wiki_url": "",
    "category": "Add Mesh",
    }

import bpy
from bpy.types import Operator
from bpy.props import FloatVectorProperty
from bpy_extras.object_utils import AddObjectHelper, object_data_add
from mathutils import Vector

class AddRetopoSU(Operator, AddObjectHelper):
    """Create a new Mesh Object"""
    bl_idname = "mesh.add_object"
    bl_label = "Add Mesh Object"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        bpy.ops.mesh.primitive_plane_add(radius=1, view_align=False, enter_editmode=False, location=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
        bpy.ops.transform.rotate(value=1.5708, axis=(1, 0, 0), constraint_axis=(True, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1)
        bpy.ops.transform.resize(value=(0.1, 0.1, 0.1), constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1)
        bpy.ops.object.modifier_add(type='MIRROR')
        bpy.ops.object.modifier_add(type='SHRINKWRAP')
        bpy.ops.object.modifier_add(type='SUBSURF')
        bpy.context.object.modifiers["Mirror"].use_clip = True
        bpy.context.object.modifiers["Mirror"].show_on_cage = True
        bpy.context.object.modifiers["Subsurf"].show_on_cage = True
        bpy.ops.object.editmode_toggle()
        bpy.ops.transform.translate(value=(-0.100995, 0, 0), constraint_axis=(True, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1, release_confirm=True, use_accurate=False)
        bpy.context.scene.tool_settings.use_snap = True
        bpy.context.scene.tool_settings.snap_element = 'VERTEX'
        bpy.context.scene.tool_settings.use_snap_align_rotation = True
        bpy.context.object.show_all_edges = True
        return {'FINISHED'}

def add_object_button(self, context):
    self.layout.operator(
        AddRetopoSU.bl_idname,
        text="Add Retopo",
        icon='MOD_SHRINKWRAP')

class AddHex(Operator, AddObjectHelper):
    bl_idname = "mesh.add_object"
    bl_label = "Add Hexagon"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        bpy.ops.mesh.primitive_circle_add(vertices=5, radius=1, fill_type='TRIFAN', view_align=False, enter_editmode=False, location=(0, 0, 0))
        return {'FINISHED'}

def add_Hex_button(self, context):
    self.layout.operator(
        AddHex.bl_idname,
        text="Add Hexagon",
        icon='MESH_ICOSPHERE')

def register():
    bpy.utils.register_class(AddHex)
    bpy.types.INFO_MT_mesh_add.prepend(add_Hex_button)
    bpy.utils.register_class(AddRetopoSU)
    bpy.types.INFO_MT_mesh_add.prepend(add_object_button)

def unregister():
    bpy.utils.unregister_class(AddHex)
    bpy.types.INFO_MT_mesh_add.remove(add_Hex_button)
    bpy.utils.unregister_class(AddRetopoSU)
    bpy.types.INFO_MT_mesh_add.remove(add_object_button)

if __name__ == "__main__":
    register()

Give it a unique bl_idname
Both operators have the same bl_idname = "mesh.add_object". When you register you are effectively overriding the first with the second.
Give it a name like
bl_idname = "mesh.add_retopo"

and call it in code with
bpy.ops.mesh.add_retopo()

or use its, now unique id in the UI layout.
layout.operator("mesh.add_retopo")

Links.
Why does operators bl_idname have to contain 1 dot?

THat worked! Thank you! But now I have to find a way to make the name and icon unique. as it stands they now have the same label and icon because the "text" and "icon" variables cannot be changed. Could I use text.hex= and text.retopo= (a dot to make them unique?)

Not quite sure what you are asking. Blender uses xxxx.yyyy to name its operators. xxxx is object for object operators by convention, but can use any lower case name dot name.  When the operator is registered it becomes bpy.ops.xxxx.yyyy() and can be added to layout by its id "xxxx.yyyy".   If another is registered with same id it overwrites the previously defined (prob in q) On the menu,  There is no need for the text argument as it already uses bl_label by default. Could add icon = 'SOME_ICON' as a class variable, and use layout.operator(AddHex.bl_idname, icon = AddHex.icon )` ?

You have answered my question. I'm sorry if I wasn't clear. I'm a few days old to this.... Thank you so much for you time and consideration! I appreciate it.


text:
Candle stand modeling question

How to model this stand? I've tried to use curve, but it doesn't look right.

Edit: Probably much easier since 2.8 with the new Mirror "Bisect" option
Former answer:

Create a cylinder (12 vertices), put its origin to its bottom.
Duplicate it with a shiftDenter.
Rotate the copy 120° on the Y axis (or whatever angle).
Duplicate the second cylinder and rotate it 120° on the Z axis.
Again create a fourth cylinder and rotate it 120°.
Now use some Boolean modifiers to merge these 4 cylinder.
Remove doubles to make the final object clean. You should not have any vertices inside your mesh but if it happened just delete them.

Alt + C (Convert to Geometry) Delete bad intersecting faces, rebuild (re model). There´s no way around to bypass this bad geometry issue you have with the skin modifier since there´s not the necessary number of polygons between intersections, not even if you scale them.
Convert the mesh. Recreate patches to the leg.

Please don't ask for upvotes in your posts, and eliminate any extraneous text not part of the answer. If you must do it in the comments


text:
Change a mesh to a specific number of faces
I'm trying to figure out individual steps of my ultimate goal from this question: Use Blender to get "Average" skull shape
And particularly, I want to duplicate what the authors of this paper did here:

Resampling of the mesh data was performed by raycasting based on a
hemi-icosphere with 20641 vertices and 43284 faces. The directions of
the rays were based on the vertices of the icosphere.

It sounds like, in order to create an 'average' skull, the authors made every skull have the same number of faces.  This makes sense given what I know about shapekeys and morphing objects into one another.  So, rather than tackle the entire project in one Stack-Exchange question, my question is very precise:
If I had a skull, or any object, with lets say 453,987 faces (random number) and I wanted it to be 43,284 faces (or some other specific number).   Could I do that?  Decimating or remeshing seem like they could get CLOSE, but is there a way to target a specific number?

You can try a Quadriflow Remesh (in the object Data Properties tab). Pick quad and select Quad and then hit the Remesh button:

Before it performs the operation, it brings up an options window where you can select, among other things, the target number of faces:

The results aren't always super pretty, and I only think I've seen once when it was able to remesh to the exact number of faces I targeted, but the algorithm generally selects what is best for the mesh (mathematically at least) and is usually pretty close to the target number. If the objects you are starting with (the different skulls) are relatively similar, they should produce quite similar results. At the very worst you will have to add or remove <30 faces manually.

The shrinkwrap modifier projects a precisely defined source mesh (with desired face count, desired edge connectivity...) onto a target mesh.
It is not a guaranteed approach. A source mesh that is too coarse will not "sample" target detail. Imagine trying to capture Suzanne's ear with a simple plane projection. Nothing is automagick; you will have to somewhat design the source mesh so that it "sits more-or-less well" on the target.

I had already 'accepted' the other answer but thank you!  I think this is an equally valid approach, I will try both and see what performs better.

To go closer to matching  the paper in question would use a hemi-icosphere (add ico sphere delete bottom half) and shrinkwrap using  "Target Normal Project".

@batFINGER  I assume they just did that hemi-icosphere because of the part of the skull they were using in their paper (kinda the top half).  Definitely easier to shrinkwrap I'm sure compared to the full skull I am trying to do with mandible and eye sockets and stuff.  Will probably cause me plenty of problems that I've been brainstorming since seeing this.  But at least I know where to start now

@JoeCrozier  only glanced over it, but suggest its about using  a lattice of points that can be compared.   Just having same amount of verts is somewhat  useless if there is no order to them..


text:
How do I "shift select" from object A to object B in outliner?
An action i would do with SHIFT in many apps , here doesnt work...whats the right shortcut ?
Thank you  !

You can border select (B and  LMB drag) the items. If you want to select the in the 3D View as well, do a  RMB click and choose Select.

YESSS THANK YOU SIR ! Actually this is another question but, what about a general move , like Plane.001 to move it above OldRustCans_09 ?
Thank you agan !

@kay Good question. Make it a new one, after uing the search function.


text:
How to disable a pie menu item?
I'm trying to write a script that creates a Pie menu, and I want the menu item on the [1] position (which calls another submenu) to be disabled whenever the current scene isn't "Some Scene".
I've tried doing
pie.menu("SOME_MT_Submenu", text='Some Submenu")
if context.scene.name != 'Some Scene':
    pie.enabled = False
pie.menu("MENU_MT_Item", text = 'Menu item #2')
pie.menu("MENU_MT_Item", text = 'Menu item #3')
pie.menu("MENU_MT_Item", text = 'Menu item #4')
#and so on

...but it just disables the entire pie menu. I've also tried adding a @classmethod poll function on the Submenu, like;
class SOME_MT_Submenu(bpy.types.Menu)
    bl_label = "Some Submenu"

    @classmethod
    def poll(cls, context):
        return context.scene.name == 'Some Scene'
    def draw(self, context):
        layout = self.layout
        layout.operator("some.operator", text = "Some Operator")
        layout.operator("some.operator", text = "Some Operator")
        layout.operator("some.operator", text = "Some Operator")

but whenever I run the script the menu item still calls out the submenu. And I've also tried adding the poll function to the 'Some Operator' class itself, and it still doesn't work.
I want that menu item to be grayed out and not call out the submenu when I hover over it. Is there a way to do that?

In the end, I just decided to get rid of the menu item itself if it doesn't satisfy the condition:
layout = self.layout
pie = layout.menu_pie()
if context.scene.name != 'Some Scene':
    pie.split()
else:
    pie.menu('SOME_MT_Submenu', text = 'Some Submenu')

Since context is an argument of draw and poll etc  methods, use context.scene rather than bpy.context.scene.

@batFINGER Thanks! I didn't  realize that XD


text:
What does the "simplify" option when exporting to FBX?
While exporting a FBX, I noticed that there is a 'simplify' option:

Unfortunately, the official documentation lacks on detail about that feature and the tooltip just says something like "How much to simplify baked value", which is not helpful:

...
Sampling Rate
TODO.
Simplify
TODO.
...

I'd like to know what it actually does and when to use this option. The default value is 1 for me. Should I just set it 0 to be safe?

The FBX exporter bakes animations at the given sampling rate. Basically you get one keyframe for every frame. Of course if the original curve wasn't changing over a particular range of time, baking gets you a bunch of duplicate keyframes. "Simplify" cleans these up by deleting keyframes that differ very little from the last keyframe. This saves space in the FBX file.
The simplify option is a factor that controls how much two keyframes are allowed to differ before they are considered different for the purpose of "simplify". With the default factor of 1.0, this is a relative difference of 0.01% or (for numbers close to zero) an absolute difference of 0.0001.
The relevant function to read is AnimationCurveNodeWrapper.simplify.
I'd leave it as the default value, but you can see if using 0.0 will fix it if you have some kind of problem with animations.


text:
What does "wm" stand for?
I noticed that many operators are under the module bpy.ops.wm namespace. What does this name stand for? I looked it up in the official docs but only found this:

All the other modules are pretty self-explanatory, but I still don't get what wm means.

wm is shorthand for window manager

Window manager.
As the name suggests

Window manager data-block defining open windows and other user
interface data

The one instance of the window manager
>>> wm = C.window_manager

Like objects, meshes, cameras the window manager is a subclass of bpy.types.ID and hence can be used to store ID properties.
>>> issubclass(bpy.types.WindowManager, bpy.types.ID)
True

>>> wm["foo"] = 33
>>> wm["foo"]
33

When set are  available for the current session of blender and hence are often used for temporary session variables, that are lost when blender is exited.
UI windows, eg the confirm dialog box, or a popover of a draw method
>>> def draw(self, context):
...     self.layout.label(text="Foo")
...
>>> wm.popover(draw)

starting modals, event timers, storing operator history, the clipboard contents
etc.
Operators associated with the window manager bpy.ops.wm... tend to be misc generic operations that poll in most contexts like show splash screen, popup a menu, set a context member, save a blend file, restore factory settings.


text:
Import options doesn't show .zmbx files
I am using Blender 3.1.2. I have a .zmbx file from Mecabricks that I want to import but, the import options doesn't show .zmbx files. I added the mecaface add on and it works fine on other models but I can't upload .zmbx file since there is no option to for import. I looked for it on add on but is not there. any help would be appreciated. :)

I think this is what you're looking for ? https://www.mecabricks.com/en/shop/product/2

Gorgious is correct. Blender Lite is the addon you need in order to import .zmbx files.


text:
Why the colors in pic 1 are so vibrant?
In the pic 1 the colors look very fresh and vibrant but in 2nd they look dull. What's the difference between the two and how can I turn colors from pic 2 to pic 1?

Try going to Render Properties > Color Management, and changing View Transform from Filmic to Standard

At least some of this effect may be due to color constancy  .. (search other links, for more dramatic examples.) I suspect if you desaturated the background sky, in the second example, the foreground colors would become more vibrant.

@ChristopherBennett that works a bit. Thanks!


text:
Can someone tell me how to turn pic 1 to pic 2?

colors in pic 1 are a bit 2d, where's pic 2 looks very clay like. What's the difference between these 2 and how can I take pic 1 to pic 2?

Please edit the question to limit it to a specific problem with enough detail to identify an adequate answer.

Hi Please use a title that reflects the content of the question. It should be descriptive but succinct, unique and identifying, summarizing the issue so that users can at a glance understand what your post is about. Use the [edit] link below your post and avoid anything not strictly essential to the post. Remember, your title is the first thing potential visitors will see, and makes your question findable for future users. See "What is the problem with posting an image or link and asking “How do I do this?""

Maybe put the Specular value of the Principled BSDF at 0 and also give a bit of Emission (0.2 for example) with the same Emission color as the Base Color? It will create a very soft material, that will look like gum

One big difference is lighting. The first example appears to be illuminated with point source or directional lights while the second is larger, more spread out illumination.
Try a sun lamp with a small size - you’ll get much sharper shadows.


text:
How can I set material to this geo node?
How can I set material to this geo node ?

https://blender.stackexchange.com/questions/216192/using-materials-with-geometry-node-modifier

Hello and welcome to Blender SE! Have you tried the node Set Material?

I’ve tried set material before group output but it didn’t work. Btw, I use blender 3.4


text:
Image texture refuses to line up with the UVs
Even though my UVs are lining up with what I'm doing in the texture paint editor, the result does not visibly line up with what the UV map and image texture suggest it should look like. I have tried smart UV unwrapping, modifying some of my seams, and all of that jazz, and nothing seems to be working. I am completely confused as to why this is happening, and I really need some help in sorting it out.
Below can be found a pair of screen shots from my screen showing what I'm seeing. On the top left, you can see my character's UV map overlayed on the image used in the texture node found at the bottom. On the top right, you can see the results.

In case its relevant, my OS is Ubuntu and I my system is an HP ENVY 750-400 Series PC.

AH! I had two objects overlaping each other. The one on top aparently had a different UV map than the one I was painting on.


text:
How to create a 2d flat mesh from a set of profile curves
My goal is to use a set of curves like theese:

Into a mesh like this, but with rounded edges and in a procedural way:

I wanna generate this curve so I set the curves shape using python to move the points around randomly and get thousands of variations of this object. And then use that to train a machine learning model.
Blender version: 2.92

Have you tried GeometryNodes?

Hi @Karan, thanks for the suggestion! I gave it a try, but couldn't get it to work. Even tried starting from a mesh instead of curves, no success.

Update: I download the latest version of blender (3.4.1) which have a lot of new geometry nodes and I could easily achieve this using the curve-to-mesh node. Thank you!


text:
How can I change the order of execution of two loops?
How can I change the order of the execution of multiple loops inside an AN node graph?
I have an A and B loop, A runs first then B. However, I want B to run first and then A to run. Rewiring the entire tree would be tedious at this point.

Q: How can I change the order of execution of two loops?

Can u show your node tree?

I added an image to the post.

Here is a weird way of doing it,
Since your first and second loop are independent(i guess). we can put them in separate node trees. Then control execution of these two node trees using another.

Note that Auto Execution must be turned off for first two trees.

Hi, Thanks for the interesting idea, I guess it is logical I will give it a try.

I think this is the most logical way to do it :) Helps keeping the logic separate if both loops are independent

How do I add 2 inputs to the expression node? And what is the type of the input for the expression node which holds the first and second variables?

I tried it with generic one and I get all kinds of errors when I try node execution of this final node group https://paste.debian.net/hidden/53de252a/

You don't have to specify type just connect to the input socket, AN automatically create generic input socket for you.

Can u share file?


text:
Why does a MixRGB node rotate my ColorRamp/mapping coordinates?
Why does a MixRGB node rotate my ColorRamp/mapping coordinates?

The Fac is set to 0 so it should have no effect on anything at all. Also notice that the voronoi pattern is not rotated but the ColorRamp.

is there another way to mix two voronoi textures together? what else do i attach the coords to to rotate them?

You can mix the Voronoi textures together if you take their color outputs and plug them into the color1 and color2 sockets of the Mix node.

I'm not giving a full answer to this, as I don't comprehend the subject 100% and can't give you a detailed explanation, but: You are working with different data types. The position output is a vector with 2 channels (X and Y) in a range from -∞ to +∞.  The MIX RGB node expects color values ranging from 0 to 1 (without clamping practically to ∞). Blender converts your data so the data entering the mix rgb node is not the same data leaving it. you can check the difference by adding a "greater than" node set to 1 at the end (replacing your color ramp).

Can you add a picture of the full node tree?

Wow I'm surprised it worked at all then, I forgot that I was using position. Thanks.

In both your cases, (with and without your Mix RGB node) you are casting a 3-component vector to a 1-component scalar Fac input to the Color Ramp node. But Blender nodes do this differently for RGB Colors, and XYZ Vectors.
The cast from Color to scalar is done with an implicit RGB to BW node; i.e. it uses the luminance of the color as its scalar result. The cast from Vector to scalar is done by taking the simple mean of the XYZ elements.
Since the Position output of your Voronoi node has a range of R and G values across the piece, varying exactly with X and Y in whatever texture-space you are using,  that explains the non-uniform interpretation of the colors as scalars across X and Y.
You could use a home-made 'Mix Vector' group, which would output a Vector, not a Color:

..but it would probably be better to find a way of achieving your desired effect without using the cast at all.


text:
How to create a semi transparent plastic shader?
I'd like to create a semi transparent plastic cycles material to match the material from this reference:

My current node setup

First rendering
Any suggestion or help on that topic, what's missing and what I should add to get that plastic material look is appreciated. Thanks.

try adding thickness to your object and blending in either SSS or translucency

@Sazerac i added the thickness but its not working perfect as i need with the reference image

Related, possible duplicate: https://blender.stackexchange.com/questions/74686/how-to-create-clear-plastic-cycles

@Mentalist can you plz send me the file with material. Im weak in material nodes hard to find all the nodes.

@atek This answer may be super helpful for you: https://blender.stackexchange.com/questions/74686/how-to-create-clear-plastic-cycles

@atek No, but here's a tip: The nodes labeled things like "Multiply" in the screen shot are just Math nodes, so search "Math" to find them. The other ones with custom labels are Value nodes. Color nodes can be found by searching "RGB". With that knowledge you should be able to find everything you need.

@Mentalist if u send me the material i can learn what in the detail inside the nodes. Thanks

@atek I don't have the material already made. And I'm not going to do your work for you, because I'm plenty busy with my own projects. If you take initiative and use the screen shot as your guide, and you will learn what you want to know.

@Mentalist As i said before im weak in material. I want to know where the small geometry node came from. When i add the geometry node it give bunch of options.

@atek The small Geometry node you see is actually a regular Geometry node, but its other options have been hidden. If you select a node and press Ctrl H all sockets except the connected ones will be hidden. Pressing Ctrl H again switches it back to showing all sockets. Good luck! :-)

There are elements of Refraction, Glossy, and Subsurface scattering in there so how about something like this :

This produces the following :

Vary the Mix factors, roughness and Subsurface scale to get the desired effect. Don't forget to have something in the scene to reflect/refract - eg, world environment texture and/or patterned surface, and suitable lighting, etc. Also, bevel any edges and ensure to add thickness.

will not getting that reference image effect and looks dark

Well, I would do it like this (I know it's not the best you can get, but...well):

Maybe someone will give you some better suggestions...
Surely you can change the Factor of the Mix Shader, where I used 0.25, or leave it out.
Hope, I could help you (and sorry for my probably bad english)

Thanks for replying well its not that perfect what i need with the reference image

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/


text:
How do I make my glasses look realistic?
I've been stuck for quite a while, it just looks wrong you can surely tell. I'm kinda new to blender, here's a picture:

Q: How can I improve the glass shader?

maybe share your file (at least a part of it) so that we can see what your nodes organization looks like and how it can be improved: https://blend-exchange.giantcowfilms.com/   other than that there must be a lot of tutorial on how to create a glass material

You can have a basic glass material if you mix these 3 nodes: Glass, Glossy and Transparent. For example this seems to work fine:

Use this node setup to get realistic glass shader in cycles...

If you add in just a glass shader, blender will try to calculate all the caustics which in turn will fill you scene with a lot of noise.The node setup I have mentioned will fake the object as a transparent yet shining surface..

How to upload an image to a post

Can you explain your choices for the lightpath? why such value for fresnel?

This worked great. Thank you

Just use the principled shader, set the transmission to 1, roughness and transmission roughness to 0 and make the base color pure white

You can select the mesh of the glass and give it a Glass BSDF material. Changing the roughness value in the properties should give you the amount of transparency you want.
No Nodes Necessary.


text:
Moving along the path - strange rotations
I would like to make an opening gate composed of segments. All segments except the lowest one work fine. The lowest, unfortunately, performs strange rotations when moving along the path. I tried adding new mesh, new empty's, extrude new bone. No good result. I'd appreciate a hint as to what I'm doing wrong. Link to the video on YT

Please share your Blend file via https://blend-exchange.com/ following the instructions there to add the link into your question.

Link to file:

That's very odd! I'm no expert on animation but the only difference I can see between that section and all the others is that the bone roll of the bottom bone is 90° and all the others are -90° but changing that bottom one to match the others makes no difference.   I don't know if anyone else here has an answer now that the blend file is available?

Hello, you didn't share the link to your file, only a jpg image, please share the link  ;)

I corrected the link :)

I'm still not sure what's gone wrong with your file, but here is a much easier solution:

Run the animation to see it in action.
If you want a different texture on each panel you can apply the array and everything will still work. (I've moved the top front edge of the panel down slightly to show the gaps between panels.)

Your solution is beautiful BUT will I be able to export this fbx with animation to Unity? I assumed that bones would be needed for the animation to work properly in Unity.

I'm afraid that I've no idea about any other software. I only ever use Blender here. Maybe someone else can give a solution to your original problem (hello @moonboots)?

Okay, I found the problem. All empty had to have a location applied, which I didn't. Now the gate opens properly :)

Ah! Yes they would need that. I thought I'd checked those. :^(


text:
How to render a 3d object in a texture
So I have somewhat of a 3d space inside this texture and I wanted to know if it is possible to draw a 3d sphere inside of
how do I tackle this with nodes if possible at all, should I use a Parametric Sphere Formula?

the end goal a sphere inside a sphere

You mean a faked 3D sphere which is flat but with the good light/shadow effects?

It looks possible in theory. But I'm unsure if there is a node set up that could achieve it.

I might attempt making a shader that is transparent in the center (maybe with the fresnel or layer weight node plugged into a color ram, plugged into a mix shader).  Then place a sphere in the middle, or using the compositor to layer the outer sphere over a render of the inner one.

@lemon yes, hopefully from all angles

This isn't perfect as the shading is a bit off. But maybe you can improve on this:
(If you add a vector mapping node to the object texture coordinates you can scale the inner sphere.)

All that is necessary is the dot product into the bump node, but this causes the auto smooth shading to go away. So the color ramp is trying to add smoothing back, but not quite perfectly.

this is pretty cool, i think that the shading issue is an eevee problem, it doesnt show in cycles


text:
Blender's "Automatic weight" and weight is 0, it will be blank
I did Blender's "Automatic weight".
I set two bones in a simple cylinder and did Automatic weight.
The weight has been set successfully.
However, the vertex of weight 0 is not zero. It is blank.
Brushes 0weight with the brush tool, and its vertex is input 0 for weight value.
But, If more the number of vertices..
Can I automatically enter 0 for weight value instead of blank for weight 0?
Please tell me how if someone know.

(Both images activate Bone1)


text:
Particle Info not working on Blender 2.8 with Eevee
The documentation for Blender 2.8 (https://docs.blender.org/manual/es/dev/render/cycles/nodes/types/input/particle_info.html?highlight=particle%20info%20node)

I am trying to use the random property of a particle info node to affect the color and emission shader. It works when I render with cycles, but not when I render with Eevee.

Are you using cycles render?

@batFINGER Yes, but I could switch to Eevee if that makes any difference. Also, I just pulled the latest from the repository today 4/20/2019.

Ooops! I am sorry, I made a mistake here. The problem is that I don't see the effect of the particle info (on the material) in the viewport. I am going to update the question.

This link (https://docs.blender.org/manual/es/dev/render/eevee/materials/nodes_support.html) does state that the particle info node is not supported in Eevee, so that answers part of the question. but how about the Viewport Display? If cycles is selected as the renderer, shouldn't the material behave as in the render? I am going to break this up into two different questions.

Good news to post here, this feature is prepared to keep going, official release a video and show the experimental version.

This link (https://docs.blender.org/manual/es/dev/render/eevee/materials/nodes_support.html) does state that the particle info node is not currently supported in Eevee, so that answers part of the question.
https://developer.blender.org/T59459

I was having the same issue but then I realized I was using the beta release from May 2018. So I just re-downloaded Blender 2.80 and it works fine now (ie Eevee supports the particle info node).

So far Blender 2.83 -> 2.90 does not, according to the documentation.
I tested with 2.83.2 and it doesn't work for "index" (at least) in EEVEE while Cycles performs flawlessly.


text:
Why doesn't updating a particle settings object `frame_start` field work? (in Blender 2.8)
I am creating a ParticleSettings object from python (Blender 2.8). All of the properties are set correctly but for frame_start, which does not change. Any ideas of why?
ps = modifier.particle_system.settings
ps.count = num_particles
ps.frame_start = explosion_frame
ps.frame_end = explosion_frame + 2
ps.lifetime = FPS * 3
ps.emit_from = 'VOLUME'
ps.normal_factor = 3
ps.tangent_phase = 0.5
ps.tangent_factor = 3
print(ps.count, ps.frame_start, ps.frame_end, ps.lifetime, ps.emit_from, ps.normal_factor, ps.tangent_phase, ps.tangent_factor)

The problem was that I was setting frame_start first, to a value greater than the current (at the time) frame_end. frame_start needs to be less or equal than frame_end. The following version does work.
ps = modifier.particle_system.settings
ps.frame_end = explosion_frame + 2
ps.frame_start = explosion_frame


text:
How can I animate the rotation quaternion of an object with just one driver?
Updated Question (driving orientation instead of location)
I'd like to animate the orientation of an object using one single driver, but it seems that the UI only let's me animate each coordinate of the rotation quaternion separately. I see that the documentation says that Context Menu --> Add Driver has the option All from Target (properties icon), but I can't manage to select more than one of the properties at once.
I would like to be able to do this via the UI first, then figure it out how to do it from Python.

Please state months of experience with Blender, Python, and Blender API.

Blender = 2 months; Python = years; Blender API = 1 month.

A suggestion is to cooperate with Blender and simply use 3 drivers on the XYZ.  So far you do not have a strong case for fighting against this.   This does not appear to be a significant inconvenience and there are other issues you have yet to encounter.
If your were to state you have many objects such as 888 objects then another approach would be warranted.
You may also use Copy [Location,et cetera] Constraint to copy values from another object.
You can search [registering a function] but I would recommend against that until you state your level of experience with Blender and Python.

how about driving the orientation? In that case, one would not want to update each coordinate of a quaternion separately, but the whole quaternion at once (all four coordinates).

The comment is a change to the concept of your original question.  You may change your words of original question.  The choice is yours.

Thanks for the advice; I updated the question accordingly.


text:
How to customize a material without duplicating it?
I know how to share a material among different objects, customizing it by using the ObjectInfo node. I want do something similar but replacing the ObjectInfo node with a custom property (different for each object, and animated with an F-Curve) that the material can automatically read as input.
How could I do this? Adding a custom property to the object? How would I access it from nodes? Could the ObjectInfo node be enhanced to support this custom property (as well as random, object index, location, material index)?

Does this help? https://blender.stackexchange.com/questions/40634/use-custom-properties-variable-values-in-the-node-editor

What kind of property do you need? Integer, float, vector?

I need a float, in the range [0.0, 1.0]. The following answer would work, but I was hoping for an easier way (e.g. augmenting the ObjectInfo node with a custom property). https://blender.stackexchange.com/questions/72101/capture-object-properties-to-use-in-a-cycles-material

@RayMairlot That link does solve my problem using drivers. Thanks for your help.

You could hack the Object ID property, the maximum is 32767 so that would give you 1 / 32767 = 0.00003 precision in [0,1] range. For real floats you can use vertex colors, but that is bigger workaround. The ultimate would be to script your own cycles node, but you would have to distribute that as an addon to everywhere you want it to work. It's also a lot more work.

Are you sure that those drivers solve your problem? The driver will have the same value for every object the material is applied to. The driver lives inside the material, not on the object.

@JaroslavJerrynoNovotny But the driver will drive the value node using each object's custom property, won't it?

@JaroslavJerrynoNovotny Do you have an example on how to hack the object id property? Also, two objects could end up with the same id; wouldn't that be a problem?

@JaroslavJerrynoNovotny You are right about the driver not being a valid approach. I would need to duplicate the material so the value node's driver can use different objects as targets.

There are not that many options how to input unique data of each object into a shader node tree.
There are vertex colors, hacking UV coordinates as numerical input, and outputs of Object Info node. There is also an option of scripting a custom Cycles node.
Because you need float in range <0, 1>, using the Object Index seems feasible. It's an integer with max value of 32767, which scaled into 0-1 range gives you 1/32767 of precision (0.00003), which is not bad. This is how you'd use it inside your material:

This is the property to animate for each object:

Just multiply your value with 32767 and round it.

This is exactly what I needed. Thanks.


text:
Blender 2.8 How to edit via the Python API an action and change keyframes
An object has an action in its animation data, how can I edit its keyframes? When I print the snippet below, I see that there are 8 entries in the dictionary of fcurves (I assume that they are three entries for translation, 3 for rotation (euler) and 3 for scale). How can I edit each specific channel of this action? For example, how do I update the translation for the keyframes for channel Z-axis?
>> for key, value in bpy.data.actions['ActionName'].fcurves.items():
...     print(key, value)
...
0 <bpy_struct, FCurve at 0x7f2299562788>
1 <bpy_struct, FCurve at 0x7f2299562c88>
2 <bpy_struct, FCurve at 0x7f2299562b88>
3 <bpy_struct, FCurve at 0x7f2299562208>
4 <bpy_struct, FCurve at 0x7f2299562a88>
5 <bpy_struct, FCurve at 0x7f2299562f08>
6 <bpy_struct, FCurve at 0x7f2299562888>
7 <bpy_struct, FCurve at 0x7f2299562d08>
8 <bpy_struct, FCurve at 0x7f2299690088>

Related https://blender.stackexchange.com/questions/74773/how-to-get-xyz-coordinates-from-f-curve  https://blender.stackexchange.com/questions/74512/how-to-get-keyframes-and-related-information  https://blender.stackexchange.com/questions/64342/finding-a-specific-fcurve

Thanks @batFINGER, all those related questions helped.

The related answers (provided by @batFINGER) answered my question, but I provide here an example for completeness sake.
# Configuration
action_name = 'MyAction'
data_path = 'location'
index = 2                   # Z axis

# Find the appropriate action
action = bpy.data.actions.get(action_name)
if action:
    # From this action, retrieve the appropriate F-Curve
    fcurve = action.fcurves.find(data_path, index)
    if fcurve:
        # Iterate over all keyframes
        for kfp in fcurve.keyframe_points:
            # Print current keyframe info
            print('Frame = {:04}; Value = {}'.format(kfp.co[0], kfp.co[1]))
            # Change keyframe data
            # Push back in time by 2 frames
            kfp.co[0] += 2
            # Move F-Curve up by 1
            kpf.co[1] += 1